设计模式之工厂模式(简单工厂,工厂方法,抽象工厂)

此篇文章介绍工厂模式包含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设计模式》



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值