工厂模式是一种创建型设计方法(封装对象的创建),包含两种:
- 工厂方法:factory method
- 抽象工厂: abstract factory
简单工厂并不属于我们经常说的23种设计模式中的,但是也是一种设计方法,之前在工程代码看到好多次,今天花一点时间来总结一下,这种方法的原理、使用以及利弊。
- 由来:
在实际的开发中,存在大量的类,这就需要我们开发者知道类的名称,需要我们自己手动的去new大量的对象。在实际生活中,我们使用的生活用品都来自于工厂,我们很少说是自己去生产生活用品,更多的是从工厂中获取这些生活用品。 - 使用实例:
#include <iostream>
#include <string>
//所有类都应该有自己的基类,驱动类
class Device{
public:
Device(std::string name):name_(name){}
virtual void show() = 0;
protected:
std::string name_;
};
//一个具体的类从它的基类派生而来,驱动srr
class Srr :public Device{
public:
Srr(std::string name):Device(name){}
void show(){
std::cout << "Get a device name:" << name_ << std::endl;
}
};
//一个具体的类从它的基类派生而来,驱动esr
class Esr :public Device{
public:
Esr(std::string name) :Device(name){}
void show(){
std::cout << "Get a device name:" << name_ << std::endl;
}
};
//简单工厂
class Simplefactory{
public:
Device * GetDevice(const std::string name){
Device *ptr = nullptr;
if ("srr" == name){
ptr = new Srr("srr");
}
else if ("esr" == name){
ptr = new Esr("esr");
}
/*
Add other classes
*/
return ptr;;
}
};
使用者只需要通过简单工厂对象实例去创建自己想要的对象:
void main(void){
Simplefactory * sp = new Simplefactory();
Device * srr = sp->GetDevice("srr");
//需要告诉工厂对应对象的创建的标志,如"srr"
srr->show();
Device * esr = sp->GetDevice("esr");
esr->show();
delete srr;
delete esr;
delete sp;
}
4. 分析:
优点:
1.将对象创建封装起来,不需要使用者自己new对象,相对比较快捷;
2.向工厂传入我们想要构造的产品名,即可以获取出来。
缺点:
1.将所有的驱动放在同一个工厂显然不符合实际,比如说宝马车工厂会生成奥迪车吗?
2.当驱动数量多了,简单工厂中Device * GetDevice(const std::string name)
部分必然会变得越来越臃肿,无论是if还是switch方法,影响美观;
3.不符合"开闭"原则(修改关,扩展开),我们要不停的修改工厂代码,不符合设计理念。