C++ 设计模式之简单工厂模式
一、使用情景
在许多情况下,我们需要创建一系列的类的实例,并且这些实例的创建过程都十分繁琐,这时候我们可以将这些类的创建过程都封装到一个工厂类中,由工厂类进行创建,从而屏蔽了创建的细节。
简单工厂的定义如下:
定义一个工厂类,它可以根据参数的不同返回不同类型的实例,被创建的实例通常都具有相同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂有被成为静态工厂方法模式。
二、实现
简单工厂的结构如下图所示:
从上图中可以看出,简单工厂模式包含三个组件:
- Factory,即工厂类。该类负责实现创建所有产品实例的逻辑。工厂可以被外界直接使用,通过
factoryMethod
方法产生所需的产品实例。 - Product,抽象产品类。该类是所有具体产品类型的父类,引入该类可以提高灵活性,使得Factory类只需要定义一个工厂方法。
- ConcreteProduct,具体产品类。该类是工厂类创建的目标。
简单工厂模式的实现基本流程为:
- 将所有需要创建的具体产品类的共同部分抽取出来作为一个抽象产品类,所有具体产品类都继承父类–自抽象产品类。
- 提供一个工厂类用于创建各种具体产品实例。该工厂类提供一个工厂方法,可以根据传入的参数不同而创建不同的具体产品类型实例。
三、代码分析
下面给出简单工厂模式的示例代码
#include <iostream>
#include <string>
#include <pthread.h>
using std::string;
class Product {
public:
virtual void whichType() = 0;
virtual ~Product(){}
};
class ConcreteProductA: public Product {
public:
virtual void whichType(){
std::cout << "Type A" << std::endl;
}
};
class ConcreteProductB: public Product {
public:
virtual void whichType(){
std::cout << "Type B" << std::endl;
}
};
class Factory {
public:
static Product* factoryMethod(string type){
Product *product;
if (type == "A")
product = new ConcreteProductA;
else if (type == "B")
product = new ConcreteProductB;
else
product = NULL;
return product;
}
};
int main(void)
{
Factory factory;
Product *typeA = factory.factoryMethod("A");
Product *typeB = factory.factoryMethod("B");
typeA->whichType();
typeB->whichType();
}
运行结果:
Type A
Type B
四、总结
简单工厂模式的主要优点:
- 客户不需要创建产品而只需要消费产品,实现了创建和使用的职责分离。
- 客户端不需要知道产品的名字而只需要产品对应的型号即可
- 通过引入配置文件,可以方便地更换具体类,实现十分灵活
简单工厂模式的主要缺点:
- 引入新的类,继承树复杂化
- 工厂类集中所有产品创建逻辑,职责过重,一旦工厂类出现问题,整个系统都会受到影响
- 拓展困难,只要增加新的具体类,就需要对工厂类进行修改,在产品类型过多时,工厂逻辑过于复杂。
简单工厂的使用场景:
- 需要创建的具体产品类组成复杂,创建过程比较复杂,客户端不想关心产品的创建,而只关心产品的使用
- 需要被创建的具体产品类种类不多,工厂类的逻辑从而也不会过于复杂