赞
踩
此篇文章介绍工厂模式包含3种:简单工厂,工厂方法,抽象工厂。
下面一一介绍
背景:开一家比萨店,店子位于对象村
简单工厂:
进行初步设计,你可能进行如下设计
现在,店子扩张,需要更多的比萨类型。。。修改设计:
通过传递一个“type”,来决定创建这个比萨
问题有来了:需要增强竞争力,加入更多比萨类型(Clam比萨,Veggie 比萨),淘汰某些比萨(Greek比萨)
于是设计更改如下:
基于前面文章介绍的,要对更改的地方进行封装,下面是使用这些原则的时候了
封装创建对象的代码:
有某个对象来负责创建比萨
有了上面的SimplePizzaFactory。orderPizza()就成了此对象的客户,当需要比萨时,就叫比萨工厂做一个。orderPizza()只关心从工厂得到了一个比萨,而这个比萨实现了Pizza接口,这个比萨可以调用Pizza所有接口方法,下面来实现一个简单的比萨工厂:
这样一来:把创建比萨的代码包装进这个类,以后实现需要改变,只改这个类,客户代码不需更改
下面是采用这样的设计后的PizzaStore类:
到这里,其实就是简单工厂的运用。简单工厂其实不是一个设计模式,反而更像一种编程习惯。
下面我们来看看最新的比萨店类图:
好了,经过这个设计,比萨店经营有成,打败了竞争者,是时候考虑开加盟店了。但是开加盟店有两个前提:
1:加盟店要保证质量,所以希望加盟店使用我现有的代码
2:加盟店有地域差异
下面是一种做法:
使用上面的设计,那么各地加盟店会像下面这样使用这些工厂
考虑更多:如前面图中已提到需要更多质量控制,有些加盟店做法差异:不要切片,包装方法不同等
下面引出了抽象方法设计模式
现在已经有一个PizzaStore作为超类;让每个域类型(NYPizzaStore,ChicagoPizzaStore,CaliforniaPizzaStore)都继承这个PizzaStore,每个子类各自决定如何制造比萨
是时候开加盟店了:
工厂方法的声明:
下面是使用工厂方法来订购比萨的例子
好了下面是实现比萨的时候了:
下面是一些具体的比萨
测试:
下面进入工厂方法模式的认识阶段:
所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类做决定该创建的对象是什么,来达到将对象创建的过程封装的目的。下面看看组成元素
另一个观点看工厂方法:
将一个orderPizza()方法和一个工厂方法联合起来,就可以成为一个框架。
定义工厂方法模式:
注:工厂方法不一定需要是抽象的
如果我们没听说过OO工厂,下面是不使用工厂模式的比萨店版本
看看上图对象之间的依赖
由上图可以看出对象之间的依赖很强:
1:高层抽象依赖具体类。PizzaStore是“高层组件”,比萨实体是“低层组件”,
可以看出PizzaStore依赖这些具体比萨类
设计原则:要依赖抽象,不要依赖具体
下面是工厂方法中这个设计原则的运用:
下面是使用此原则的一些指导方针:
1:变量不要持有具体类的引用
2:不要让类派生具体类
3:不要覆盖基类中已实现的方法
至此工厂方法介绍完毕,下面进入抽象工厂的介绍
问题背景:加盟店开起来了,但是有一些加盟店,使用低价原料来增加利润。所以得采取一些手段
为了确保原料一致:我们建立一个原料家族,而每个地域的加盟店实现自己的一组原料家族:
下面生产原料
按照此方法可以创建ChicagoPizzaIngredientFactory,这里不做介绍
我们不需要设计两个类来处理不同风味的比萨,让原料工厂处理这种差异就可以了:上面是CheesePizza
下面来看看比萨店
下面进入抽象工厂模式定义
下面是从PizzaStore的观点来看:
注:其实工厂方法是潜伏在抽象工厂里面的,仔细看看!
到此,三个工厂模式已经介绍完毕,有不懂的地方,还请参考《Head First设计模式》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。