Thursday, 28 April 2016

Abstract factory design pattern

Abstract factory design pattern

It is a factory of factories. Abstract factory returns a list of factories that produces related items.
E.g.: A car assembler company can assemble a Ford car and a BWM car.
Based on a client can ask to get a Ford or a BMW. So if there is 1 single factory, that factory has to implement all the various items it can generate for all different brands. Additionally the assembler has to keep track of the brand. Otherwise he may order a Ford “car body” and a BMW “interiors”. This will result in incompatibility of the parts. Hence it makes sense to have sub-factories. The assembler then will get back a factory instance, and can use it to get all compatible parts of a car.

public class AbstractFactory {
     
      private static final AbstractFactory instance = new AbstractFactory();
     
      private AbstractFactory() {
            super();
      }

      public static AbstractFactory getInstance() {
            return instance;
      }
     
      public I_Factory getFactory(String brand) {
            if(brand.equals("ford")) {
                  return Ford_Factory.getInstance();
            } else {
                  return BMW_Factory.getInstance();
            }
      }

}
public interface I_Factory {
     
      public I_CarPart getPart(String partName);

}
public class BMW_Factory implements I_Factory {
     
      private static final I_Factory instance = new BMW_Factory();
     
      private BMW_Factory() {
            super();
      }

      public static I_Factory getInstance() {
            return instance;
      }

      @Override
      public I_CarPart getPart(String partName) {
            if(partName.equals("body")) {
                  return new BMW_Body();
            } else {
                  return new BMW_Interiors();
            }
      }

}
public class Ford_Factory implements I_Factory {
     
      private static final I_Factory instance = new Ford_Factory();
     
      private Ford_Factory() {
            super();
      }

      public static I_Factory getInstance() {
            return instance;
      }

      @Override
      public I_CarPart getPart(String partName) {
            if(partName.equals("body")) {
                  return new Ford_Body();
            } else {
                  return new Ford_Interiors();
            }
      }

}
public interface I_CarPart {
     
      public void description();

}
public class Ford_Body implements I_CarPart {

      @Override
      public void description() {
            System.out.println("Ford body");
      }

}
public class Ford_Interiors implements I_CarPart {

      @Override
      public void description() {
            System.out.println("Ford interiors");
      }

}
public class BMW_Body implements I_CarPart {

      @Override
      public void description() {
            System.out.println("BMW body");
      }

}
public class BMW_Interiors implements I_CarPart {

      @Override
      public void description() {
            System.out.println("BMW interiors");
      }

}
public class MainClass {
     
      public static void main(String[] args) {
            System.out.println("Assembling ford car");
            I_Factory factory = AbstractFactory.getInstance().getFactory("ford");
            factory.getPart("body").description();
            factory.getPart("interiors").description();
            System.out.println("Assembling BMW car");
            factory = AbstractFactory.getInstance().getFactory("BMW");
            factory.getPart("body").description();
            factory.getPart("interiors").description();
      }

}

Result:
Assembling ford car
Ford body
Ford interiors
Assembling BMW car
BMW body

BMW interiors

Code link : https://github.com/sksumit1/DesignPatterns

No comments:

Post a Comment