The abstract factory pattern provides an interface for creating families of related or dependent objects without specifying their concrete classes. This pattern is part of creational design pattern, it is also called as factory of factories.
Abstract factory allows a client to use an abstract interface to create a set of related products(or objects) without knowing (or caring) about the concrete products that are actually produced.
Implementation
We are going to create a Vehicle and a Color interface ,and concrete classes implementing these interfaces. We have created VehicleFactory and ColorFactory that extends AbstractFactory interface. A factory handler/creator/generator class FactoryHandler is created.
UML Diagram:
Step 1
Create a Vehicle interface.public interface Vehicle {
void printVehicle();
}
Step 2
Create concrete class extending Vehicle interface.
public class TwoWheeler implements Vehicle {
@Override
public void printVehicle() {
System.out.println("I am two wheeler");
}
}
public class ThreeWheeler implements Vehicle {
@Override
public void printVehicle() {
System.out.println("I am three wheeler");
}
}
public class FourWheeler implements Vehicle {
@Override
public void printVehicle() {
System.out.println("I am four wheeler");
}
}
Step 3
Create a Color interface.
public interface Color {
public void paint();
}
Step 4
Create concrete classes that implements Color interface.
public class Red implements Color {
@Override
public void paint() {
System.out.println("Vehicle painted with red color.");
}
}
public class Green implements Color {
@Override
public void paint() {
System.out.println("Vehicle painted with green color.");
}
}
public class Blue implements Color {
@Override
public void paint() {
System.out.println("Vehicle painted with blue color.");
}
}
Step5
Create AbstractFactory interface to get factories for Vehicle and Color objects.
The AbstractFactory class defines the interface that all concrete factories must implement, which consist of a set of methods for producing objects.
public interface AbstractFactory {
public Vehicle getVehicle(String vName);
public Color getColor(String color);
}
Step 6
Create factory classes that will implement AbstractFactory interface and generate object of concrete classes base of given information.
public class VehicleFactory implements AbstractFactory {
public Vehicle getVehicle(String vName) {
if (vName == null)
return null;
else if (vName.equalsIgnoreCase("TwoWheeler"))
return new TwoWheeler();
else if (vName.equalsIgnoreCase("ThreeWheeler"))
return new ThreeWheeler();
else if (vName.equalsIgnoreCase("FourWheeler"))
return new FourWheeler();
else
return null;
}
@Override
public Color getColor(String color) {
return null;
}
}
public class ColorFactory implements AbstractFactory {
@Override
public Vehicle getVehicle(String vName) {
return null;
}
@Override
public Color getColor(String color) {
if (color == null)
return null;
else if (color.equalsIgnoreCase("RED"))
return new Red();
else if (color.equalsIgnoreCase("BLUE"))
return new Blue();
else if (color.equalsIgnoreCase("GREEN"))
return new Green();
else
return null;
}
}
Step 7
Create a FactoryHandler class to get factory object based on some information like Vehicle or Color.
public class FactoryHandler {
public static AbstractFactory getFactory(String choice) {
if (choice == null)
return null;
else if (choice.equalsIgnoreCase("VEHICLE"))
return new VehicleFactory();
else if (choice.equalsIgnoreCase("COLOR"))
return new ColorFactory();
else
return null;
}
}
Step 8
Create AbstractFactoryPatternClient class that will test the abstract factory pattern.
public class AbstractFactoryPatternClient {
public static void main(String[] args) {
// get Vehicle factory
AbstractFactory vehicleFactory = FactoryHandler.getFactory("VEHICLE");
// get an object of TwoWheeler
Vehicle twoWheeler = vehicleFactory.getVehicle("TWOWHEELER");
// call printVehicle method of TwoVehicle
twoWheeler.printVehicle();
// get an object of ThreeWheeler
Vehicle threeWheeler = vehicleFactory.getVehicle("THREEWHEELER");
// call printVehicle method of ThreeVehicle
threeWheeler.printVehicle();
// get an object of FourWheeler
Vehicle fourVehicle = vehicleFactory.getVehicle("FOURWHEELER");
// call printVehicle method of FourVehicle
fourVehicle.printVehicle();
// get Color Factory
AbstractFactory colorFactory = FactoryHandler.getFactory("COLOR");
// get an object of color Red
Color red = colorFactory.getColor("RED");
// call paint method of Red
red.paint();
// get an object of color Green
Color green = colorFactory.getColor("GREEN");
// call paint method of Green
green.paint();
// get an object of color Blue
Color blue = colorFactory.getColor("BLUE");
// call paint method of Blue
blue.paint();
}
}
Output of the above program shown below.
I am two wheeler I am three wheeler I am four wheeler Vehicle painted with red color. Vehicle painted with green color. Vehicle painted with blue color.Note: Depend on abstractions, Do not depend on concrete classes.

factorial hundred In the last few days, the “factorial of 100” is one of the top subjects and a lot of maths geeks compute it using voice assistants such as Alexa, Shiri, etc.
ReplyDeletefactorial hundred In the last few days, the “factorial of 100” is one of the top subjects and a lot of maths geeks compute it using voice assistants such as Alexa, Shiri, etc.
factorial hundred In the last few days, the “factorial of 100” is one of the top subjects and a lot of maths geeks compute it using voice assistants such as Alexa, Shiri, etc.