游戏开发设计模式 factory_method模式

属于是对象创建模式的一种,这类模式的特点是:用虚函数运行时依赖的特点创建对象,绕开new,避免对象创建(new)过程的紧耦合。通常是接口抽象后的第一步工作。
定义一个用于创建对象的接口(侯捷课上说的,就是相当于重写一个支持多态的new方法)让子类决定实例化哪一个类。Factory_method就启到了一个让类的实例化延迟的作用。
在这里插入图片描述

在这里插入图片描述

就是有个虚函数 (参数就肯定相同了),用的时候根据传来的工厂判断要生产的是什么东西。
工厂模式有效的解决了添加新产品必须要修改工厂类代码的问题,新增一种武器只需要新增一个武器类型的工厂即可,符合开闭原则。
工厂模式的本质是将具体的创建工作放在了具体子类的工厂中进行

#pragma once
//多态创建对象所需要的参数形式必须是相同的
//产品基类
template<typename T>
class Base_weapon {
public:
	virtual void describe() {

	}
	virtual ~Base_weapon() {}
};
//工厂基类
template<typename T>
class Base_weapon_factory {
public:
	virtual Base_weapon<T>* create() = 0;//这里的=0意思是纯虚函数,不然的话编译的时候会要求返回值不能为空
	virtual ~Base_weapon_factory() {}
};

//concrete产品
template<typename T>
class concrete_weapon1 :public Base_weapon<T> {
public:
	virtual void describe() {
		cout << "我是一把一类型武器" << endl;
	}
};

template<typename T>
class concrete_weapon2 :public Base_weapon<T> {
public:
	virtual void describe() {
		cout << "我是一把二类型武器" << endl;
	}
};

//concrete工厂
template<typename T>
class weapon1_factory :public Base_weapon_factory<T> {
public:
	virtual Base_weapon<T>* create() {
		return new concrete_weapon1<T>;
	}
};

template<typename T>
class weapon2_factory :public Base_weapon_factory<T> {
public:
	virtual Base_weapon<T>* create() {
		return new concrete_weapon2<T>;
	}
};

//测试用的
template<typename T>
class Test_factory_use {
public:
	Base_weapon_factory<T>* factory;
	Test_factory_use(Base_weapon_factory<T>* fac) :factory(fac) {}//这就要求外界要知道要传啥工厂进去
	void Test_make_a_weapon() {
		Base_weapon<T>* unkown_weapon= factory->create();
		unkown_weapon->describe();
	}
};

接口

//测试工厂模板方法
	cout << "测试factory_method方法" << endl;
	weapon1_factory<bool>* Weapon1_factory1 = new weapon1_factory<bool>;//这是要传进去的工厂
	Test_factory_use<bool>* Test_factory = new Test_factory_use<bool>(Weapon1_factory1);
	Test_factory->Test_make_a_weapon();

http://dingxiaowei.cn/2017/05/14/参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值