0%

四、工厂模式

简单工厂

假设你有一个披萨店,你的代码可能这么写
50817134

当更多的披萨类型的时候,必须修改代码,从而创建适合的披萨类型
50996013

封装创建对象的代码

  • 将创建对象的代码从orderPizza()中抽离。
  • 将这部分代码搬到另一个对象中,这个对象只负责如何创建pizza。
    我们称这个新对象为工厂。工厂处理创建对象的细节。当需要一个披萨时,将让披萨工厂做一个。

51455140

重做PizzaStore类

51626977

定义简单工厂

简单工厂其实不是一个设计模式,反而比较像是一种编程习惯。

52286337

工厂方法

披萨店进行扩张,实行加盟模式。每家加盟店都可能想要提供不同风味的披萨。
54006355

第一个做法
如果利用SimplePizzaFactory,写出三种不同的工厂,分别是NYPizzaFactory、ChicagoPizzaFactory、CaliforniaPizzaFactory。那么各地加盟店都有合适的工厂使用。
54210336

多一些质量控制
在推广SimpleFactory时,你发现加盟店的确实采用你的工厂创建披萨,但是其他部分,却开始采用他们自创的流程:烘烤做法有差异,不要切片,使用其他厂商的盒子等。
在我们之前的SimpleFactory之前,制作披萨的代码绑在PizzaStore里,但这么做并没有弹性。
有个做法可以让披萨制作活动局限于PizzaStore中,而同时又能让这些加盟店依然可以自由的制作该区域的风味。所要做的事情就是将createPizza()方法放回到PizzaStore中,不过要将它定义为抽象方法,然后为每个区域创建一个PizzaStore的子类。
58157933

类图:
58262465
工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户端程序中关于超类的代码就和子类对象创建代码解耦了。

认识工厂方法
所有工厂模式都是用来封装对象的创建。工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象的创建过程封装的目的。
59545558

定义工厂方法模式
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
65255049

抽象工厂

认识抽象工厂
要如何确保每家加盟店使用高质量的原料?你打算建造一家生产原料的工厂,并将原料送往各家加盟店。加盟店位于不同区域,纽约的红酱料和芝加哥的红酱料是不一样的。
现在,我们要建造一个工厂来生产原料,这个工厂将负责创建原料家族中的每一种原料。

  1. 为每个区域建造一个工厂。你需要创建一个继承自PizzaIngredientFactory的子类来实现每一个创建方法。
  2. 实现一组原料类供工厂使用
  3. 然后,你仍然需要将这一切组织起来,将新的原料工厂整合进PizzaStore中。

定义抽象工厂
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户端使用抽象接口来创建一组相关产品,而不需要关心具体产品是什么。这样客户就从具体产品中解耦。

66073710

源码:https://github.com/chentianming11/design-pattern
factory包!