C++设计模式——工厂方法模式
概述
工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品
场景分析
依旧是简单工厂模式中提到的例子。红色警戒中兵工厂派兵时,可以有中国士兵,美国士兵和苏联士兵。在简单工厂模式中,我们通过一个工厂类来进行逻辑处理从而可以派送出不同国家的士兵。但是简单工厂模式中的缺点也很明显,假如现在想加入英国士兵,那么就不得不改动兵工厂这个类,很明显违反了设计模式六大原则之一的开放封闭原则。那么今天我们使用工厂方法模式来处理同样的问题。
类图描述
SoldiersFactory:抽象的兵工厂类。用来申明兵工厂中公共的方法。
ChineseSoldiersFactory…:具体的兵工厂类。用来实现抽象工厂类中申明的公共方法。
Soldiers:抽象的士兵类,用来申明士兵中的公共方法。
ChineseSoldiers…:具体的工厂类,用来实现抽象士兵类中提供的公共方法。
代码实现
//Soldiers
#ifndef SOLDIERS_H_
#define SOLDIERS_H_
#include <iostream>
using namespace std;
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
#ifndef FACTORY_METHOLD
#define FACTORY_METHOLD
#include <iostream>
#include "Soldiers.h"
using namespace std;
class FactoryMethold
{
public:
virtual Soldiers* CreateSoldiers() = 0;
};
class ChineseFactory : public FactoryMethold
{
public:
virtual Soldiers* CreateSoldiers()
{
return new ChineseSoldiers();
}
};
class AmericanFactory : public FactoryMethold
{
public:
virtual Soldiers* CreateSoldiers()
{
return new AmericanSoldiers();
}
};
class SovietFactory : public FactoryMethold
{
public:
virtual Soldiers* CreateSoldiers()
{
return new SovietSoldiers();
}
};
#endif
//main.cpp
#include <iostream>
#include "FactoryMethold.h"
using namespace std;
#ifndef DELETE_OBJECT
#define DELETE_OBJECT(p) \
{\
if(NULL != (p))\
{\
delete (p);\
(p) = NULL;\
}\
}
#endif
int main()
{
FactoryMethold* ChFactory = new ChineseFactory();
Soldiers* ChSoldiers = ChFactory->CreateSoldiers();
std::string strChSoldiers = ChSoldiers->GetSoldiers();
cout << "Get Chinese Soldiers : " << strChSoldiers.c_str() << endl;
DELETE_OBJECT(ChFactory);
DELETE_OBJECT(ChSoldiers);
FactoryMethold* AmFactory = new AmericanFactory();
Soldiers* AmSoldiers = AmFactory->CreateSoldiers();
std::string strAmSoldiers = AmSoldiers->GetSoldiers();
cout << "Get American Soldiers : " << strAmSoldiers.c_str() << endl;
DELETE_OBJECT(AmFactory);
DELETE_OBJECT(AmSoldiers);
FactoryMethold* SoFactory = new SovietFactory();
Soldiers* SoSoldiers = SoFactory->CreateSoldiers();
std::string strSoSoldiers = SoSoldiers->GetSoldiers();
cout << "Get Soviet Soldiers : " << strSoSoldiers.c_str() << endl;
DELETE_OBJECT(SoFactory);
DELETE_OBJECT(SoSoldiers);
return 0;
}
优缺点
优点:
- 工厂方法模式明显克服了简单工厂模式中违背了开放封闭原则的缺点。如果有英国士兵要加入,那么只需要实现英国士兵的具体工厂类即可,不需要改工厂类。从而降低了客户端和工厂的耦合性,可以说是进化后的简单工厂模式。
缺点:
- 每增加一个新的产品,那么就要增加产品对应的一个工厂,对开发是一件比较头疼的事儿。
适用场景
同样只适合产品类型比较少的业务中。
对产品所对应的工厂,调用者应该清楚的知道。
对于使用者来说,只需要通过抽象工厂生产出产品供他使用即可,不需要知道具体产品生产过程中的所有逻辑处理。