未经授权,禁止转载!创作不易,尊重原创!~~
背景
在软件系统中,经常面临中创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。 --《设计模式》 GoF
case
王者荣耀这款游戏,在对战模式下,英雄的选择全靠召唤师的选择(变化点)。但对战的整体流程是确定的, 比例对战的峡谷环境,英雄的数量等(确定的)。可以设计一个稳定的对战模式的类,但其中英雄用工厂模式去实例化。
// hero_factory.h
#include<iostream>
#include "hero.h"
class HeroFactory {
public:
HeroFactory() {}
~HeroFactory() {}
virtual Hero* initHero() = 0;
};
class Shouyue_MatchMode_Factory : public HeroFactory {
public:
Hero* initHero() {
Shouyue_Zhuque zhuque = Shouyue_Zhuque();
Hero* hero = new Shouyue_MatchMode(&zhuque);
return hero;
}
Shouyue_MatchMode_Factory() {}
~Shouyue_MatchMode_Factory() {}
};
// battle_mode.h
#include <iostream>
// #include "hero.h"
#include "hero_factory.h"
class BattleMode {
public:
BattleMode(HeroFactory* hero_factory): hero_factory_(hero_factory) {}
~BattleMode(){}
void initBattleField() {
std::cout << "------init heros------" << std::endl;
Hero* hero = hero_factory_->initHero();
std::cout << "~~hero " << hero->name() << " has arrived at battlefield~~" << std::endl;
}
private:
HeroFactory* hero_factory_;
};
// main.cc
#include <iostream>
// #include "hero_factory.h"
#include "battle_mode.h"
int main () {
Shouyue_MatchMode_Factory shouyue_factory = Shouyue_MatchMode_Factory();
BattleMode battle_mode = BattleMode(&shouyue_factory);
battle_mode.initBattleField();
return 0;
}
一点疑惑:
为什么initBattleField不能用HeroFactory类指针作为其参数, 这样就不用工厂方法了。
initBattleField(HeroFactory* hero_fctory) {…}