工厂方法模式

未经授权,禁止转载!创作不易,尊重原创!~~

背景

在软件系统中,经常面临中创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
如何应对这种变化?如何绕过常规的对象创建方法(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) {…}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值