设计模式介绍
一、简单工厂
简单工厂不是23中标准设计模式之一,但是太常用了,这里就介绍下
1. 简单工厂定义
提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
2. 简单工厂本质
简单工厂的本质是选择实现
3. 简单工厂结构和说明
(1) 结构
(2) 调用顺序
4. 简单工厂适用情况
- 如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,那么可以选用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现
- 如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂,一个简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到个简单工厂来,从而实现集中管理和控制。
5. 简单工厂优缺点
(1) 优点
- 帮助封装
简单工厂虽然很简单,但是非常友好地帮助我们实现了组件的封装,然后让组件外部能真正面向接口编程。 - 解耦
通过简单工厂,实现了客户端和具体实现类的解耦。如同上面的例子,客户端根本就不知道具体是由谁来实现,也不知道具体是如何实现的,客户端只是通过工厂获取它需要的接口对象。
(2) 缺点
- 可能增加客户端的复杂度
如果通过客户端的参数来选择具体的实现类,那么就必须让客户端能理解各个参数所代表的具体功能和含义,这样会增加客户端使用的难度,也部分暴露了内部实现,这种情况可以选用可配置的方式来实现。 - 不方便扩展子工厂
私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。不过,通常情况下是不需要为简单工厂创建子类的
6. 相关模式
- 简单工厂和抽象工厂模式
简单工厂是用来选择实现的,可以选择任意接口的实现。一个简单工厂可以有多个用于选择并创建对象的方法,多个方法创建的对象可以有关系也可以没有关系
抽象工厂模式是用来选择产品簇的实现的,也就是说一般抽象工厂里面有多个用于选择并创建对象的方法,但是这些方法所创建的对象之间通常是有关系的,这些被创建的对象通常是构成一个产品簇所需要的部件对象。
所以从某种意义上来说,简单工厂和抽象工厂是类似的,如果抽象工厂退化成为只有一个实现,不分层次,那么就相当于简单工厂了 - 简单工厂和工厂方法模式
简单工厂和工厂方法模式也是非常类似的。
工厂方法的本质也是用来选择实现的,跟简单工厂的区别在于工厂方法是把选择具体实现的功能延退到子类去实现。
如果把工厂方法中选择的实现放到父类直接实现,那就等同于简单工厂。
二、简单工厂示例代码
#include <iostream>
using namespace std;
//抽象产品
class AbstractProduct {
public:
virtual ~AbstractProduct() {}
virtual void Operation() = 0;
};
//具体产品A
class ProductA : public AbstractProduct {
public:
void Operation() { cout << "ProductA" << endl; }
};
//具体产品B
class ProductB : public AbstractProduct {
public:
void Operation() { cout << "ProductB" << endl; }
};
//简单工厂
class Factory {
public:
static AbstractProduct* CreateProduct(char product) {
AbstractProduct* ap = nullptr;
switch(product)
{
case 'A':
{
ap = new ProductA();
break;
}
case 'B':
{
ap = new ProductB();
break;
}
default:
break;
}
return ap;
}
};
int main() {
AbstractProduct* aPa = Factory::CreateProduct('A');
if(aPa != nullptr)
{
aPa->Operation(); // ProductA
delete aPa;
}
AbstractProduct* aPb = Factory::CreateProduct('B');
if(aPb != nullptr)
{
aPb->Operation(); // ProductB
delete aPb;
}
return 0;
}