上次用了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;