Abstract Factory Pattern
The Abstract Factory Pattern consists of an AbstractFactory, ConcreteFactory, AbstractProduct, ConcreteProduct and Client. We code against AbstractFactory and AbstractProduct and let the implementation to others to define ConcreteFactory and ConcreteProduct
Why Abstract Factory Introduced?
Another layer of abstraction over factory pattern. Abstract Factory patterns work around a super-factory which creates other factories. Factory pattern deals with creating objects of a single type(AppleFactory manufactures Iphones), while the Abstract Factory pattern deals with creating objects of related types(MobileFactory manufactures Mobiles). Abstract Factory pattern is more robust and consistent and uses composition to delegate responsibility of object creation.
When to use Abstract Factory?
When higher level of Abstraction is required.Provides an interface for creating families of related objects
MobileManufactureFactory.java
public interface MobileManufactureFactory { public Mobiles getManufacturerDetails(); }
Mobiles.java
public interface Mobiles { public void getMobileModels(); }
AppleFactory.java
public class AppleFactory implements MobileManufactureFactory { @Override public Mobiles getManufacturerDetails() { return new Iphone(); } }
GoogleFactory.java
public class GoogleFactory implements MobileManufactureFactory { @Override public Mobiles getManufacturerDetails() { return new Android(); } }
MicrosoftFactory.java
public class MicrosoftFactory implements MobileManufactureFactory { @Override public Mobiles getManufacturerDetails() { return new Windows(); } }
IphoneMobiles.java
public class IphoneMobiles implements Mobiles { @Override public void getMobileModels() { System.out.println("Iphone 13,14 and 15"); } }
AndroidMobiles.java
public class AndroidMobiles implements Mobiles { @Override public void getMobileModels() { System.out.println("Oneplus, Realme, Samsung"); } }
WindowsMobile.java
public class WindowsMobile implements Mobiles { @Override public void getMobileModels() { System.out.println("Samsung Focus, Nokia Lumia, Pocket PC"); } }
MobileFactory.java
public class MobileFactory { private MobileFactory(){ } public static MobileManufactureFactory getMobilesBasedOnManufacturer(MobileCompany manufacturerName){ if(manufacturerName.equals(MobileCompany.APPLE)){ return new AppleFactory(); }else if(manufacturerName.equals(MobileCompany.MICROSOFT)){ return new MicrosoftFactory(); }else if(manufacturerName.equals(MobileCompany.GOOGLE)){ return new GoogleFactory(); } return null; } }
MobileCompany.java
public enum MobileCompany { APPLE, MICROSOFT, GOOGLE }
Client.java
public class Client { public static void main(String[] args) { MobileManufactureFactory objMobileManufa = MobileFactory.getMobilesBasedOnManufacturer(MobileCompany.APPLE); Mobiles objMobile = objMobileManufa.getManufacturerDetails(); objMobile.getMobileModels(); } }
Output
Iphone 13,14 and 15