简单工厂模式下,如果老板拓展业务了,加了一个牛肉种类的披萨,就得在源码基础上修改,那么这就违背了开闭原则(ocp),即对扩展开放,对修改关闭。于是,为了解决这个问题,就又了方法工厂模式。
在方法工厂模式中,将对象的实例化方式从工厂类中分离出去,具体的实现由子类来完成。每个子类都代表工厂类的一个产品种类,负责创建对应的对象。方法工厂模式的优点在于它将具体的对象创建过程延迟到子类中处理,使得整个系统更加灵活。缺点在于每增加一种产品就需要创建一个对应的工厂子类,这样会导致工厂类的数量增加,代码的复杂性也会增加。
抽象工厂MeAbStractFactory:
public interface MeAbstractFactory { Pizza createPizza(); } DouShaFactory: //豆沙披萨 public class DouShaFactory implements MeAbstractFactory { @Override public Pizza createPizza() { return new DouShaPizza("豆沙披萨"); } }
PorkFactory:
//猪肉披萨 public class PorkFactory implements MeAbstractFactory { @Override public Pizza createPizza() { return new PorkPizza("猪肉披萨"); } }
BeefFactory:
//牛肉披萨 public class BeefFactory implements MeAbstractFactory { @Override public Pizza createPizza() { return new BeefPizza("牛肉披萨"); } }
Test:
//3.方法工厂模式 @Test void methodFactory(){ MeAbstractFactory factory=new PorkFactory(); Pizza pork = factory.createPizza(); pork.prepare(); pork.make(); pork.braise(); }
之前的SimpleFactory在createPizza中直接就new出来了,但在方法工厂中,我们将createPizza这个动作推迟到了MeAbStactFactory的子类(XXFactory)中才完成。
好处就是,比如后期要卖个羊肉披萨,我们直接编写个羊肉披萨类,然后实现MeAbstractFactory类就,实现它自己的功能,这样完全不用修改原来的代码了,也就解决了违反OCP原则的问题。
本文固定URL:https://www.dotcpp.com/course/1357