设计模式之工厂模式-工厂方法模式
大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目。
来源:凯哥Java(kaigejava)
需求:
披萨项目:
要方便披萨品种的扩展、要便于维护、要能运行时候方便扩展
来看看披萨族设计:
司小司经过分析得到:披萨都需要烘焙(bake)、切割(cut)、包装(box)还有就是披萨原材料准备(prepare)。其中变化的就是prepare准备的原材料。不同披萨的原材料不同,但是都需要进行烘焙、切割、包装。所以,我们这里原材料方法就做抽象的,不具体实现了。经过分析之后得到如下类图:
第一次设计:使用简单工厂模式(可以参考上一篇的司小司面馆项目)发现不行。为什么呢?
随着披萨越来越火,很多地方都要加盟了。如果加盟的话,每个地方都要创建一个简单工厂模式那样,同样的代码,就要创建很多份,在维护的时候,就很麻烦的。
选择第二种设计:工厂方法模式。
先来看看项目结构:
说明:
1:domain:是具体pojo对象。都继承于PizzaAbstract类
其中以BeiJin开头的,都是北京连锁店的。以ShanHai开头的都是上海连锁店的。
2和3是披萨和披萨订单的抽象类
4:具体连锁点的订单类。都继承于PiazzOrderAbstract类
5:测试类
我们先来看看两个抽象类。
PizzaAbstract类:
PizzaOrderAbstract类:
在来看一个北京的greekpizza:
在来看看BeiJinOrderPizza:
测试类:
查看运行结果:
通过上面代码演示,我们可以得到以下:
工厂方法模式设计方案:
将披萨项目里的披萨对象实例化功能抽象成抽象方法,在不同加盟店具体实现功能。
工厂方法模式:
定义了一个创建对象的抽象方法,由子类决定要实例化的类。从这句话中,我们可以知道,工厂方法模式是将对象的实例化(创建)推迟到子类中了。
工厂方法模式和简单工厂模式对比:
简单工厂模式:
根据类的标识,通过工厂对象就可以得到具体类的实例对象了。在工厂对象里面,类对象的实例化如下:
对象的实例化,是在工厂对象里面。
工厂方法模式:
是将对象的创建,抽取出来了。就是创建披萨的方法,抽取到一个具体的类中。
我们在来看看,披萨订单对象:
在具体调用的时候:
PizzaOrderAbstract bjOder = new BeiJinOrderPizza();调用具体的子类。
而对象的实例化,是在子类中进行的。
工厂方法模式通过一个抽象的工厂类来创建工厂,再由工厂通过一定的方法创造一定的对象,这样如果有新的产C出现不需要修改已有代码只要新建一个产品的从子类和工厂的子类就可以啦。