C++11 设计模式3. 工厂方法模式
简单工厂模式的遗留问题
//从上面的代码可以看到,简单工厂模式确实实现了new 出来具体对象, 和 业务逻辑的分离,
//但是不符合 "开闭原则"
//"开闭原则"说的是代码扩展性问题——对扩展开放,对修改关闭(封闭);
//假设过了两天,策划找到我们说:加一种怪物,新怪物类型:M_Beast(野兽类)
//那我们要怎么改呢?首先肯定是加一个 M_Beast类了,继承Monster
//然后MonsterFactory 中改动 createMonster方法完成。
//很显然,我们要改动到原先的 createMonster 方法,这是违反了 "开闭原则的"。
//那么如何改动才合理呢?这就要用到 "工厂方法" 模式
解决方案:工厂方法 模式
工厂方法(Factory Method)模式:简称工厂模式或者多态工厂模式。
//与简单工厂模式比,灵活性更强,实现也更加复杂,引入更多的新类。
//M_UndeadFactory,M_ElementFactory,M_MechanicFactory类,有一个共同的父类M_ParFactory(工厂抽象类):
//符合开闭原则,付出的代价是需要新增加多个新的工厂类。
//定义(实现意图):定义一个用于创建对象的接口(M_ParFactory类中的createMonster成员函数,这其实就是个工厂方法,工厂方法模式的名字也是由此而来),
//但由子类(M_UndeadFactory、M_ElementFactory、M_MechanicFactory)决定要实例化的类是哪一个。
//该模式使得某个类(M_Undead、M_Element、M_Mechanic)的实例化延迟到子类(M_UndeadFactory、M_ElementFactory、M_MechanicFactory)。
//出现新怪物类型:M_Beast(野兽类)。
//一般可以认为,将简单工厂模式的代码经过把工厂类进行抽象改造成符合开闭原则后的代码,就变成了工厂方法模式的代码。
代码实现
#include using namespace std; //(1)简单工厂(Simple Factory)模式 //策划:亡灵类怪物,元素类怪物,机械类怪物:都有生命值,魔法值,攻击力三个属性。 //Monster作为父类,M_Undead(亡灵类),M_Element(元素类怪物),M_Mechanic(机械类怪物)。 namespace _namespace1 { class Monster { public: Monster(int life, int magic, int attack) : m_life(life), m_magic(magic), m_attack(attack) { }; virtual ~Monster() {}; protected: int m_life; int m_magic; int m_attack; }; //M_Undead(亡灵类) class M_Undead :public Monster { public: M_Undead(int life, int magic, int attack) :Monster(life, magic, attack) { cout