The Factory Pattern in Java is one of the most famous Creational Design Pattern, it is also known as Factory Method Pattern. A factory is a java class which implements the Java Encapsulation to hide the object creation details form the user. A factory class returns the object which is required based on the data which is passed to the factory.
In a Factory Method Pattern we will be declaring an interface or an abstract class and let the subclass to decide which object to instantiate.
Advantages of Factory Design Pattern
- The Factory Design Pattern enables the class to have loose coupling and high cohesion, it essentially decouples the calling class from the target class.
- Factory Pattern lets the sub class to decide which object needs to be created and encapsulates the object creation from the client.
Let’s take the below Factory Pattern Example, VehicleFactory class which will be returning the Vehicle instance based on the input passed.
Factory Pattern in Java Example
Vehicle.java (abstract class)
package com.javainterviewpoint; public abstract class Vehicle { public abstract void travel(); }
Vehicle is a simple abstract class, having an unimplemented method travel(). Whatever class which is extending the Vehicle class should provide implementation for it (Bus and Car in our case).
Bus.java
package com.javainterviewpoint; public class Bus extends Vehicle { @Override public void travel() { System.out.println("Bus is travelling"); } }
Bus is a sub class of Vehicle and Overrides the method travel() and returns “Bus is travelling”
Car.java
package com.javainterviewpoint; public class Car extends Vehicle { @Override public void travel() { System.out.println("Car is travelling"); } }
Car is also a sub class of Vehicle and it provides implementation for the method travel() and returns “Car is travelling”
VehicleFactory.java
package com.javainterviewpoint; public class VehicleFactory { public Vehicle getVehicle(String vehicleType) { if("Bus".equals(vehicleType)) { return new Bus(); } else { return new Car(); } } }
Our VehicleFactory class is the place where the actual Factory Design Pattern is implemented. The getVehicle() is the factory’s object creation method. It takes string as a parameter if the String passed is “Bus” it will create the Bus Object, for all other String it returns the Car Object.
VehicleLogic.java
package com.javainterviewpoint; public class VehicleLogic { public static void main(String args[]) { VehicleFactory vf = new VehicleFactory(); Vehicle v1 = vf.getVehicle("Bus"); v1.travel(); Vehicle v2 = vf.getVehicle("Car"); v2.travel(); } }
The VehicleLogic class uses the VehicleFactory for getting different types of Vehicle Object. In the first case we will be getting a Bus object and in the second case it will be Car instance. Finally travel() method is called on the different instances obtained.
We will be getting the output like below.
Instead of passing the String as the parameter to the getVehicle() method of VehicleFactory class we can also pass an enum to it. Then our VehicleFactory and VehicleLogic will be modified like below
VehicleType Enum
package com.javainterviewpoint; public enum VehicleType { BUS,CAR }
VehicleFactory
package com.javainterviewpoint; public class VehicleFactory { public Vehicle getVehicle(VehicleType vehicleType) { Vehicle vehicle = null; switch(vehicleType) { case BUS: vehicle = new Bus(); break; case CAR: vehicle = new Car(); break; } return vehicle; } }
VehicleLogic
package com.javainterviewpoint; public class VehicleLogic { public static void main(String args[]) { VehicleFactory vf = new VehicleFactory(); Vehicle v1 = vf.getVehicle(VehicleType.BUS); v1.travel(); Vehicle v2 = vf.getVehicle(VehicleType.CAR); v2.travel(); } }
Factory Method Design Pattern Implementation in JDK
In JDK itself you can see at lot of place they have implemented Factory Design Pattern eg:
- java.util.Calendar#getInstance()
- java.util.ResourceBundle#getBundle()
- java.lang.Class#newInstance()
- java.lang.Class#forName()
- java.text.NumberFormat#getInstance()
- java.nio.charset.Charset#forName()
- java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
- java.sql.DriverManager#getConnection()
- java.net.URL#openConnection()
Hope you got a better understanding towards Factory Method Pattern in Java. Do let me know your comments or thoughts as well through the comment section below. Happy Learning 🙂
Leave a Reply