1. 作用
简单工厂是工厂模式的扩展版,作用就不必多说,可以参看工厂模式。
它与工厂模式的区别在于为每一个产品定义一个创造者,即一个工厂方法只创建一个对象。
- UML类图
参与者:
- Product:产品抽象类,定义产品的接口。
- ConcreteProduct:产品,实现产品接口。
- Factory:工厂抽象类,主要定义创建产品的接口,即工厂方法,返回产品对象。
- ConcreteFactory:工厂具体类,实现产品的创建,一个具体工厂类关联一个具体产品。
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(){}
//核心接口
virtual Product* createProduct() = 0;
};
/***TV工厂***/
class TVFactory :public XiaoMFactory
{
public:
TVFactory(){}
virtual ~TVFactory(){}
//核心接口
virtual Product* createProduct()
{
return new Tv;
}
};
/***Fridge工厂***/
class FridgeFactory :public XiaoMFactory
{
public:
FridgeFactory(){}
virtual ~FridgeFactory(){}
//核心接口
virtual Product* createProduct()
{
return new Fridge;
}
};
/***Washer工厂***/
class WasherFactory :public XiaoMFactory
{
public:
WasherFactory(){}
virtual ~WasherFactory(){}
//核心接口
virtual Product* createProduct()
{
return new Washer;
}
};
/***********工厂开始运行*********************/
int main()
{
//开始造产品
XiaoMFactory *tvFactory = new TVFactory;
Product * tv = tvFactory->createProduct();
tv->showMe();
XiaoMFactory *washerfactory = new WasherFactory;
Product * washer = washerfactory->createProduct();
washer->showMe();
XiaoMFactory *fridgefactory = new FridgeFactory;
Product * fridge = fridgefactory->createProduct();
fridge->showMe();
delete tvFactory;
delete washerfactory;
delete fridgefactory;
delete tv;
delete washer;
delete fridge;
return 0;
}
结果:
我是一台电视机!
我是一台洗衣机!
我是一台冰箱!
请按任意键继续. . .
4 优缺点
这里优缺点仅与工厂模式作比较。
优点:一个产品对应一个具体工厂类,结构更加清晰,职责简单。
缺点:扩展比较复杂,每增加一个产品需要增加一个具体工厂类。
5. 适用场景
在创建对象且需要初始化对象操作比较多的时候,可以使用多工厂简单化工厂方法。
6. 总结
简单工厂就工厂模式的扩展版本,通过增加具体工厂使工厂方法职责单一,简单化,但是扩展相对复杂。