简单工厂
假设你有一个披萨店,你的代码可能这么写:
当更多的披萨类型的时候,必须修改代码,从而创建适合的披萨类型:
封装创建对象的代码
- 将创建对象的代码从orderPizza()中抽离。
- 将这部分代码搬到另一个对象中,这个对象只负责如何创建pizza。
我们称这个新对象为工厂。工厂处理创建对象的细节。当需要一个披萨时,将让披萨工厂做一个。
重做PizzaStore类
定义简单工厂
简单工厂其实不是一个设计模式,反而比较像是一种编程习惯。
工厂方法
披萨店进行扩张,实行加盟模式。每家加盟店都可能想要提供不同风味的披萨。
第一个做法
如果利用SimplePizzaFactory,写出三种不同的工厂,分别是NYPizzaFactory、ChicagoPizzaFactory、CaliforniaPizzaFactory。那么各地加盟店都有合适的工厂使用。
多一些质量控制
在推广SimpleFactory时,你发现加盟店的确实采用你的工厂创建披萨,但是其他部分,却开始采用他们自创的流程:烘烤做法有差异,不要切片,使用其他厂商的盒子等。
在我们之前的SimpleFactory之前,制作披萨的代码绑在PizzaStore里,但这么做并没有弹性。
有个做法可以让披萨制作活动局限于PizzaStore中,而同时又能让这些加盟店依然可以自由的制作该区域的风味。所要做的事情就是将createPizza()方法放回到PizzaStore中,不过要将它定义为抽象方法,然后为每个区域创建一个PizzaStore的子类。
类图:
工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户端程序中关于超类的代码就和子类对象创建代码解耦了。
认识工厂方法
所有工厂模式都是用来封装对象的创建。工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象的创建过程封装的目的。
定义工厂方法模式
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
抽象工厂
认识抽象工厂
要如何确保每家加盟店使用高质量的原料?你打算建造一家生产原料的工厂,并将原料送往各家加盟店。加盟店位于不同区域,纽约的红酱料和芝加哥的红酱料是不一样的。
现在,我们要建造一个工厂来生产原料,这个工厂将负责创建原料家族中的每一种原料。
- 为每个区域建造一个工厂。你需要创建一个继承自PizzaIngredientFactory的子类来实现每一个创建方法。
- 实现一组原料类供工厂使用
- 然后,你仍然需要将这一切组织起来,将新的原料工厂整合进PizzaStore中。
定义抽象工厂
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户端使用抽象接口来创建一组相关产品,而不需要关心具体产品是什么。这样客户就从具体产品中解耦。
源码:https://github.com/chentianming11/design-pattern
factory包!