1. 作用
简单工厂是工厂模式的简化版,作用就不必多说,可以参看工厂模式。
它与工厂模式的区别在于去除了抽象工厂类,并且工厂方法也为静态方法。
2. UML类图
参与者:
- Product:产品抽象类,定义产品的接口。
- ConcreteProduct:产品,实现产品接口。
- Factory:工厂类,定义静态(static)工厂方法,实现产品的创建,通常传入参数是产品的代号,即枚举或者字符串标记。
3. 实现
- 举例:小明最近开了一家工厂名字叫——小明工厂,可以生产电视机,冰箱,洗衣机,刚开始品种不能太多,也不能太少。
- 类图
- 代码
#include <iostream>
using namespace std;
/****************产品****************************/
typedef enum//代号枚举
{
TV_Enum,
Fridge_Enum,
Washer_Enum
}ProductEnum;
//产品抽象类
class Product
{
public:
Product(){}
virtual ~Product(){}
virtual void showMe() = 0;
};
/***电视机***/
class Tv : public Product
{
public:
Tv(){}
~Tv(){}
virtual void showMe()
{
cout << "我是一台电视机!" << endl;
}
};
/***冰箱***/
class Fridge : public Product
{
public:
Fridge(){}
~Fridge(){}
virtual void showMe()
{
cout << "我是一台冰箱!" << endl;
}
};
/***洗衣机***/
class Washer :public Product
{
public:
Washer(){}
~Washer(){}
virtual void showMe()
{
cout << "我是一台洗衣机!" << endl;
}
};
/****************************工厂***************************/
/**工厂具体类**/
class XiaoMFactory
{
public:
XiaoMFactory(){}
virtual ~XiaoMFactory(){}
//核心接口
static Product* createProduct(ProductEnum productName);
};
/**小明的工厂**/
Product* XiaoMFactory::createProduct(ProductEnum productName)
{
Product *p;
switch (productName)
{
case TV_Enum:
p = new Tv;
break;
case Fridge_Enum:
p = new Fridge;
break;
case Washer_Enum:
p = new Washer;
break;
default:break;
}
return p;
}
/***********工厂开始运行*********************/
int main()
{
//开始造产品
Product * tv = XiaoMFactory::createProduct(TV_Enum);
tv->showMe();
Product * washer = XiaoMFactory::createProduct(Washer_Enum);
washer->showMe();
Product * fridge = XiaoMFactory::createProduct(Fridge_Enum);
fridge->showMe();
delete tv;
delete washer;
delete fridge;
return 0;
}
4. 优缺点
这里优缺点仅与工厂模式作比较。
优点:简化了工厂类,无需抽象工厂,一个静态工厂方法就可以创建产品,调用方便。
缺点:不适合扩展,增减产品只能在静态方法中修改。
5. 适用场景
在创建对象较少,扩展可能性不太大,又想将客户与创建过程解耦时,可以使用。
6. 总结
简单工厂就是工厂模式的简化版本,用最简单的方法实现了创建对象过程与客户的解耦。