1.概述
使用设计模式可以提高代码的可复用性、可扩展性和可维护性。
简单工厂模式(Simple Factory Pattern)属于创建型模式。简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例,它经常被用于封装创建对象的代码。
简单工厂模式类图结构:
SimpleFactory:简单工厂类,简单工厂模式的核心,它负责实现创建所有实例。简单工厂创建产品的方法可以被外界直接调用来创建所需的产品对象。
IProduct:抽象产品类,简单工厂模式创建的所有对象的父类,它负责描述所有实例所共有的公共函数接口。
ConcreteProduct:具体产品类,是简单工厂模式的创建目标。
2.举例
假如比萨店现在需要建立一套点餐系统,需要将客户点的比萨加入到账单中。比萨店向客户推出了不同口味的比萨,有蛤蜊披萨(Clam Pizza)、素食披萨(Veggie Pizza)和芝士比萨(Cheese Pizza)等。这就用到了简单工厂模式。
下面以 C++ 来实现简单工厂模式。
(1)创建抽象产品类 Pizza
class Pizza {
public:
// 纯虚函数
virtual string getDescription() = 0;
};
(2)创建具体产品类
接着我们创建各个口味的比萨,它们都继承了抽象父类 Pizza ,并实现了父类的 getDescription() 方法。
// 蛤蜊比萨。
class ClamPizza :public Pizza {
string name = "蛤蜊比萨";
public:
string getDescription() {
return name + " 价格45元";
}
};
// 素食比萨。
class VeggiePizza:public Pizza {
string name = "素食比萨";
public:
string getDescription() {
return name + " 价格26元";;
}
};
// 芝士比萨。
class CheesePizza:public Pizza {
string name = "比萨";
public:
string getDescription() {
return name + " 价格38元";;
}
};
(3)创建简单工厂类
接下来创建一个简单工厂类,它提供了一个静态方法 createPizza() 用来生产比萨。你只需要传入你想生产的比萨名称,它就会实例化相应比萨对象:
enum PizzaName {CLAM,VEGGIE,CHEESE};
class PizzaFactory {
public:
static Pizza* createPizza(PizzaName name) {
Pizza* pizza = nullptr;
switch (name){
case CLAM:
pizza = new ClamPizza();
break;
case VEGGIE:
pizza = new VeggiePizza();
break;
case CHEESE:
pizza = new CheesePizza();
break;
}
return pizza;
}
};
(4)客户端调用工厂类
客户端调用简单工厂类,传入不同口味比萨的名称生产出比萨并调用该对象 getDescription() 方法:
#include <iostream>
#include <string>
using namespace std;
int main() {
cout<<PizzaFactory::createPizza(CLAM)->getDescription()<<endl;
cout<<PizzaFactory::createPizza(VEGGIE)->getDescription()<<endl;
cout<<PizzaFactory::createPizza(CHEESE)->getDescription()<<endl;
}
程序输出结果:
蛤蜊比萨 价格45元
素食比萨 价格26元
比萨 价格38元
3.使用场景和优缺点
-
使用场景
(1)工厂类负责创建的对象比较少。
(2)客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。 -
优点
使用户根据参数获得对应的类实例,避免了直接实例化类,降低用户代码与目标类间的耦合性。 -
缺点
可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改简单工厂类,违背了开放封闭原则(Open Closed Principle)。 简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。
4.小结
(1)简单工厂模式满足了 OO 设计原则:为交互对象之间的松耦合设计而努力。
(2)简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例,它经常被用于封装创建对象的代码。
参考文献
Freeman E.,Freeman E.,Sierra K.,et al.设计模式[M].第一版O’Reilly Taiwan公司译.北京:中国电力出版社,2015:110-117
设计模式(四)简单工厂模式