游戏开发设计模式 抽象工厂模式

上次用了factory_method模式,这实际上是抽象工厂模式的一种特例化(指只有一组变化)
使用的场合是:需要创建一组产品,产品之间存在互相依赖的关系,类比到游戏开发中,就是在难度1的游戏中,只有难度1的敌人和难度1的地图,不能是难度1的敌人搭配难度2的地图。
方法是:提供一个接口,让该接口负责创建一系列”相关或者相互依赖的对象“,无需指定他们具体的类(和工厂方法的概念差不多,就是多了依赖的关系)

在这里插入图片描述
在这里插入图片描述

#pragma once
#include <iostream>
using namespace std;
//设计一个根据选择游戏难度,生成一系列(依赖)敌人AI,地图等内容

template<typename T>
class enemy_base {
public:
	virtual void describe() = 0;
};

template<typename T>
class graph_base {
public:
	virtual void describe() = 0;
};

template<typename T>
class enemy_level_1 :public enemy_base<T> {
public:
	virtual void describe() {
		cout << " 游戏是难度1的敌人 ";
	}
};

template<typename T>
class enemy_level_2 :public enemy_base<T> {
public:
	virtual void describe() {
		cout << " 游戏是难度2的敌人 ";
	}
};

template<typename T>
class graph_level_1 :public graph_base<T> {
public:
	virtual void describe() {
		cout << " 是难度等级1的地图 " << endl;
	}
};

template<typename T>
class graph_level_2 :public graph_base<T> {
public:
	virtual void describe() {
		cout << " 是难度等级2的地图 " << endl;
	}
};

template<typename T>
class base_difficult_factory {
public:
	enemy_base<T>* now_enemy;
	graph_base<T>* now_graph;
	virtual enemy_base<T>* create_enemy() = 0;//这俩其实应该写成protected比较好,外边就看不见这俩了
	virtual graph_base<T>* create_graph() = 0;
	void create() {
		now_enemy = create_enemy();
		now_graph = create_graph();
		cout << "已成功完成工厂的生产 ";
	}
	void describe() {
		now_enemy->describe();
		now_graph->describe();
		cout << endl;
	}
};

template<typename T>
class difficult_1_factory :public base_difficult_factory<T> {
public:
	virtual enemy_base<T>* create_enemy() {
		return new enemy_level_1<T>;
	}
	virtual graph_base<T>* create_graph() {
		return new graph_level_1<T>;
	}
};

template<typename T>
class difficult_2_factory :public base_difficult_factory<T> {
public:
	virtual enemy_base<T>* create_enemy() {
		return new enemy_level_2<T>;
	}
	virtual graph_base<T>* create_graph() {
		return new graph_level_2<T>;
	}
};
//测试用的
template<typename T>
class Test_abstract_factory_used {
public:
	base_difficult_factory<T>* factory;
	Test_abstract_factory_used(base_difficult_factory<T>* fac) :factory(fac) {}
	void Test_make_a_game() {
		/*
		enemy_base<T>* My_enemy;
		graph_base<T>* My_graph;
		*/
		factory->create();
		/*
		My_enemy = factory->now_enemy;
		My_graph = factory->now_graph;
		*/
		factory->describe();//这次我直接让他自己描述,这相当于是一组里面是两个产品。存放在factory中
		/*
		My_enemy->describe();
		My_graph->describe();
		cout << endl;
		*/

		//注释的和没注释的作用是一样的
	}
};

接口

	//测试抽象工厂
	cout << "测试abstract factory设计模式" << endl;
	difficult_1_factory<bool>* level_1_factory1 = new difficult_1_factory<bool>;
	Test_abstract_factory_used<bool>* Test_difficult_factory = new Test_abstract_factory_used<bool>(level_1_factory1);
	Test_difficult_factory->Test_make_a_game();
	cout << endl;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值