工厂模式(factory pattern)
工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory)、工厂方法(factory method)、抽象工厂(abstract factory)。
简单工厂包括3种组成元素:抽象产品、具体产品、具体工厂(简单工厂),结构图如下:
C++实现:
//抽象产品 class Car { public: virtual string getDescription() = 0; }; //具体产品 class Audi : public Car { public: string getDescription() { return "Audi"; } }; class BMW : public Car { public: string getDescription() { return "BMW"; } }; class Ford : public Car { public: string getDescription() { return "Ford"; } }; class Hummer : public Car { public: string getDescription() { return "Hummer"; } }; class Toyota : public Car { public: string getDescription() { return "Toyota"; } }; class Bentley : public Car { public: string getDescription() { return "Bentley"; } }; //简单工厂 class CarFactory { public: Car* createCar(string name) { if (name == "Audi") return new Audi; else if (name == "BMW") return new BMW; else if (name == "Ford") return new Ford; else if (name == "Hummer") return new Hummer; else if (name == "Toyota") return new Toyota; else if (name == "Bentley") return new Bentley; } }; int main() { CarFactory factory; Car *mycar = factory.createCar("Audi"); cout << mycar->getDescription() << endl; mycar = factory.createCar("BMW"); cout << mycar->getDescription() << endl; delete mycar; }
可以看出,在简单工厂模式下,一个具体的工厂负责所有具体产品的创建,适用于产品种类较少的情况。当新增产品时,我们需要修改简单工厂的实现逻辑,违背了开放关闭原则。
工厂方法模式在简单工厂模式基础上,增加了一个抽象工厂。
抽象工厂只定义了创建对象的接口,由具体子类负责具体对象的创建。
C++实现:
//抽象工厂 class CarFactory { public: virtual Car* createCar() = 0; }; //具体工厂 class AutiCarFactory : public CarFactory { public: Car* createCar() { return new Audi; } }; class BMWCarFactory : public CarFactory { public: Car* createCar() { return new BMW; } }; int main() { CarFactory *pcf = new AutiCarFactory; Car *c = pcf->createCar(); cout << c->getDescription() << endl; delete pcf; pcf = new BMWCarFactory; c = pcf->createCar(); cout << c->getDescription() << endl; delete pcf; }
在工厂方法模式下,当新增一个产品种类时,只需要创建一个新的产品类和一个新的对应工厂类即可,没有破坏原有代码,遵循了开放关闭原则。
抽象工厂模式比较抽象,为此引入以下两个概念:
产品等级结构:
产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族:
在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
此时再贴张结构图就更清晰了:
抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,
一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品
族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。
抽象工厂的一个应用是:在很多软件系统中需要更换界面主题,要求界面中的按钮、文本框、背景色等一起发生改变时,可以使用抽象工厂模式进行设计。
抽象工厂的一个缺点是:增加新的工厂和产品族容易,增加新的产品等级结构麻烦。
reference:
http://design-patterns.readthedocs.org/zh_CN/latest/creational_patterns/abstract_factory.html
Simple Factory Vs Factory Method Vs Abstract Factory by Example