介绍
简单工厂模式是属于创建型模式(工厂模式、抽象工厂模式、单例模式、建造者模式),又称之为静态工厂模式,它不属于23中设计模式之一,在简单工厂中可以根据参数的不同返回不同类的实例,简单工厂模式专门定义了一个工厂类来创建其他类的实例(其他类有一个共同的基类,使用了多态),简单工厂模式是工厂模式中最简单使用的一种模式。场景分析
当我们去超时购物的时候,收银员可以扫描不同的商品,可以显示出不同的价格,我们可以把商品看做是一个基类,当扫描商品时候,工厂类根据不同的商品生成具体的商品,得到商品的价格。这就是简单工厂模式的案例,UML如图所示:二、代码展示
抽象产品类代码:
// 抽象类
class AbstratcGoods
{
public:
// 得到商品价格
virtual double GetSpice() = 0;
private:
double spice;
};
具体产品实现代码:
// 具体实现 香蕉
class BananaGoods : public AbstratcGoods
{
public:
virtual double GetSpice();
};
//具体实现 苹果
class AppleGoods : public AbstratcGoods
{
public:
virtual double GetSpice();
};
double Goods::BananaGoods::GetSpice()
{
return 3.5;
}
double Goods::AppleGoods::GetSpice()
{
return 5.5;
}
简单工厂核心代码:
// 商品类型
enum GoodsEnum
{
BananaEnum,
AppleEnum
};
// 商品工厂
class GoodsFactory
{
public:
// 创建具体商品
AbstratcGoods *Create(GoodsEnum type);
};
AbstratcGoods * Goods::GoodsFactory::Create(GoodsEnum type)
{
switch (type)
{
case Goods::BananaEnum:
return new BananaGoods();
case Goods::AppleEnum:
return new AppleGoods();
default:
return NULL;
}
}
调用代码:
#include "GoodsFactory.h"
using namespace std;
using namespace Goods;
int main()
{
GoodsFactory *factory = new GoodsFactory;
AbstractGoods *banana = factory->Create(GoodsEnum::BananaEnum);
cout << "banana spice : " << banana->GetSpice() << endl;
AbstractGoods *apple = factory->Create(GoodsEnum::AppleEnum);
cout << "apple spice : " << apple->GetSpice() << endl;
delete apple;
delete banana;
delete factory;
apple = NULL;
banana = NULL;
factory = NULL;
system("pause");
return 0;
}
简单工厂的优点和缺点
优点
工厂类可以决定创建产品的实例,客户端不需要直接去创建,实现了责任分割,客户端也无需知道产品类的类名,只需要产品类的基类就可以了,可以根据外界给定的信息,决定创建的具体对象。
缺点
工厂类集中了实例创建的逻辑,违背了开源封闭原则,当我们此时增加梨(PearGoods),时候就需要修改工厂类。在产品类型比较多的时候,不利于系统的维护。
总结
1、工厂类负责创建的对象固定或者对象比较少。
2、客户端只需要知道传入工厂类的参数,对于如何创建不关心的情况下。