工厂方法模式,也称为工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
简单工厂违背开闭原则,当新增一种产品时,就需要去变更工厂类。
主要是将类的实例化延迟到工厂类的子类中完成,即由子类来决定应该实例化哪个类,工厂类不再负责产品的创建,而是由具体工厂实现接口,这样当新增产品时就无需修改工厂类逻辑,而是添加新的工厂类,符合开闭原则,解决了简单工厂的缺点。
创建抽象工厂类
abstract class TeaFactory{
public abstract Tea getTea();
}
创建抽象产品
abstract class Tea{
abstract void drink();
abstract void drinkAfter();
}
创建具体产品类
class GreenTea extends Tea{
public GreenTea(){
System.out.print("正在制作");
}
public void drink(){
System.out.print("喝绿茶");
}
public void drinkAfter(){
System.out.print("刷杯子");
}
}
创建具体工厂类
class GreenTeaFactory extends TeaFactory{
@Override
public Tea getTea(){
return new GreenTea();
}
}
调用具体工厂类的方法,从而创建不同具体产品类的实例
public class client{
public static void main(Strings[] args){
TeaFactory greenTeafactory = new GreenTeaFactory();
Tea tea = greenTeafactory.getTea();
tea.drink();
tea.drinkAfter();
}
}
优点:
符合开闭原则,当新增加产品时,增加具体产品类和相应的工厂子类即可;
符合单一职责原则,每个具体工厂类只负责创建对应的产品;
不适用静态工厂方法,可以形成基于继承的等级结构;
缺点:
添加新产品时,类的个数成对增加,在一定程度上增加了系统的复杂度。同时更多的类需要编译和运行,会给系统带来一些额外的开销;
虽然保证了工厂类的开闭原则,但对于使用工厂方法的类,如需产品变更时,仍需修改实例化的具体工厂类;
一个具体工厂只能创建一个具体产品;
总结:
工厂模式是简单工厂模式的进一步抽象和扩展,保留简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。