Skip to content

Factory Pattern

  • It comes under creational pattern as this pattern provides one of the best ways to create an object.
  • We create object without exposing the creation logic to the client and refer to newly created object using a common interface.

Applicability:

  • Use the Factory Pattern when you don’t know beforehand the exact types and dependencies of the objects your code should work with.
  • Use the Factory Method when you want to provide users of your library or framework with a way to extend its internal components.
  • Use the Factory Method when you want to save system resources by reusing existing objects instead of rebuilding them each time.

Pros and Cons

Pros Cons
You avoid tight coupling between the creator and the concrete products. The code may become more complicated since you need to introduce a lot of new subclasses to implement the pattern. The best case scenario is when you’re introducing the pattern into an existing hierarchy of creator classes.
Single Responsibility Principle. You can move the product creation code into one place in the program; making the code easier to support.
Open/Closed Principle. You can introduce new types of products into the program without breaking existing client code.

Class Diagram

Factory Pattern

Implementation

Step 1

Create an interface.
Shape.java

public interface Shape {
   void draw();
}

Step 2

Create concrete classes implementing the same interface.
Circle.java

public class Circle implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

Rectangle.java

public class Rectangle implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Square.java

public class Square implements Shape {
   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

Step 3

Create a Factory to generate object of concrete class based on given information.
ShapeFactory.java

public class ShapeFactory {
   //use getShape method to get object of type shape 
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }     
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}

Step 4

Use the Factory to get object of concrete class by passing an information such as type.
FactoryPatternDemo.java

public class FactoryPatternDemo {

   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();

      //get an object of Circle and call its draw method.
      Shape shape1 = shapeFactory.getShape("CIRCLE");

      //call draw method of Circle
      shape1.draw();

      //get an object of Rectangle and call its draw method.
      Shape shape2 = shapeFactory.getShape("RECTANGLE");

      //call draw method of Rectangle
      shape2.draw();

      //get an object of Square and call its draw method.
      Shape shape3 = shapeFactory.getShape("SQUARE");

      //call draw method of square
      shape3.draw();
   }

Output

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.