C++设计模式——简单工厂模式
概述
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
场景分析
记得小的时候有个很火的游戏叫红色警戒。进去以后从一个很简单的基地车开始发展,可以建造坦克和各种类型的兵。我们用简单工厂模式来实现以下兵工厂造兵的这个情景。
类图描述
SoldiersFactory:兵工厂类,是整个简单工厂模式的核心,负责实现所有不同类型的产品设计和内部逻辑
Soldiers:抽象兵类,负责描述所有兵的公共接口。
ChineseSoldiers…:具体的兵类,负责实现抽象兵工厂中的公共接口。
代码实现
产品类实现
//兵工厂的抽象类和具体实现类
#ifndef PRODUCT_H_
#define PRODUCT_H_
#include <iostream>
class Soldiers
{
public:
virtual std::string GetSoldiers() = 0;
};
class ChineseSoldiers : public Soldiers
{
public:
virtual std::string GetSoldiers()
{
return "Chinese Soldiers";
}
};
class AmericanSoldiers : public Soldiers
{
public:
virtual std::string GetSoldiers()
{
return "American Soldiers";
}
};
class SovietSoldiers : public Soldiers
{
public:
virtual std::string GetSoldiers()
{
return "Soviet Soldiers";
}
};
#endif
工厂类实现
//工厂类头文件FactoryMethold.h
#ifndef FACTORY_MODEL_H_
#define FACTORY_MODEL_H_
#include "Product.h"
class FactoryMethold
{
public:
enum SoldersType{Chinese,American,Soviet};
Soldiers* CreateSoldiers(SoldersType type);
};
//工厂类cpp文件FactoryMethold.cpp
#include "FactoryMethold.h"
Soldiers* FactoryMethold::CreateSoldiers( SoldersType type )
{
Soldiers* soldiers = nullptr;
switch (type)
{
case FactoryMethold::Chinese:
soldiers = new ChineseSoldiers();
break;
case FactoryMethold::American:
soldiers = new AmericanSoldiers();
break;
case FactoryMethold::Soviet:
soldiers = new SovietSoldiers();
break;
default:
break;
}
return soldiers;
}
#endif
Main函数调用
#include <iostream>
#include "FactoryMethold.h"
#include "Product.h"
#ifndef DELETE_OBJECT
#define DELETE_OBJECT(Obj) \
{\
if (Obj) \
{\
delete (Obj); \
(Obj)=NULL;\
}\
}
#endif
using namespace std;
int main()
{
FactoryMethold * Factory = new FactoryMethold();
Soldiers* ChSlodiers = Factory->CreateSoldiers(FactoryMethold::Chinese);
Soldiers* AmSlodiers = Factory->CreateSoldiers(FactoryMethold::American);
Soldiers* SoSlodiers = Factory->CreateSoldiers(FactoryMethold::Soviet);
cout << "Chinese Soldiers' Factory: " << ChSlodiers->GetSoldiers().c_str() << endl;
cout << "American Soldiers' Factory: " << AmSlodiers->GetSoldiers().c_str() << endl;
cout << "Soviet Soldiers' Factory: " << SoSlodiers->GetSoldiers().c_str() << endl;
DELETE_OBJECT(ChSlodiers);
DELETE_OBJECT(AmSlodiers);
DELETE_OBJECT(SoSlodiers);
return 0;
}
优缺点
优点:
工厂类负责了产品生产过程中所有的逻辑实现,将产品的创建和产品的使用解耦。
客户端不需要知道产品类的具体名称,只需要知道产品所对应的参数即可。
缺点:
- 如果现在要添加新的兵种,那么就不得不修改工厂类,这违反了设计模式六大原则——开闭原则。而且工厂类的职责过重,如果工厂类出现问题,那么整个系统将会陷入瘫痪。
适用场景
根据简单工厂模式的缺点可以总结到,简单工厂模式适合产品对象比较少,并且需求改动不多的案例中。