简单工厂模式由于不易扩展,违背闭包原则,为了解决这个问题,就产生了工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要加入新的功能,只需要加入工厂实现类就可以了。
工厂方法模式也叫做虚拟构造器模式或者多态工厂模式,工厂父类定义所有产品对象的公共接口,通过工厂子类来负责产生具体哪个产品对象,将产品实例化操作延迟到工厂子类中完成。
抽象产品角色(Product):定义产品的接口
具体产品角色(ConcreteProduct) :具体产品类
抽象工厂角色(Creator) :声明工厂方法(FactoryMethod),返回一个产品
真实的工厂(ConcreteCreator):实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例(客户调用的是这个!)
1.不知道所需要的类:
客户端不知道具体产品的类名,只需要知道所对应的工厂就可以了,客户端需要知道创建具体产品的工厂类,通过工厂类来创建具体的对象。
2.一个类通过其子类来指定创建那个对象
优点:
1.客户调用工厂子类来创建具体的产品,客户无需关心产品对象的具体创建细节,只需要关心对应的工厂即可。
2.工厂角色和产品角色的多态性设计,使得父工厂可以自主决定创建那个产品对象,具体的创建过程是在工厂子类中完成。
3.当需要加入新产品时无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改具体的工厂和具体的产品,只需要添加一个具体工厂和具体产品就可以了。
系统的可扩展性变得非常好,完全符合开闭原则。
缺点:
1.在添加新的产品的时候,需要加入成对的具体产品类和具体工厂类,提升了系统的复杂性,更多的类需要编译运行,给系统带来了额外的开销。
2.由于考虑了系统的可扩展性,引入了抽象层,增加了系统的抽象性和理解难度,实现时可能还需要dom,和反射等技术,增加了系统的实现难度。
也就是改写之前简单工厂模式的代码即可。
public interface IApplePhoneFactory { void getSize(); }
public class IphoneXFactory implements IApplePhoneFactory{ @Override public void getSize() { IphoneX iphoneX = new IphoneX(); iphoneX.getSize(); } }
调用具体的子工厂实例返回即可。
工厂方法模式又称为工厂模式,它属于类创建型模式
工厂方法模式包含四个角色
工厂方法模式的主要优点是增加新的产品类时无须修改现有系统,并封装了产品对象的创建细节,系统具有良好的灵活性和可扩展性;
其缺点在于增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。
原文:https://www.cnblogs.com/yaoyaoo/p/14313258.html