设计模式:享元模式
作者:互联网
回答了对纯粹对象方案(就是万物皆对象)在设计大量细粒度对象时候的性能问题,比如字符的字体属性,按说每个字符都需要有字体属性,但是一篇文章一共就几种字体,如果对每个字符都单独设置一个font属性,开销就会很大。
享元模式(flyweight)采用对象共享的方法来降低系统中对象的个数,从而降低内存压力。(在实际使用中,享元一般设置为只读的)。
我们维护一个享元池,每次需要享元时,我们就尝试根据一个value(所以在代码中pool设计成了map)从中拿共享对象,存在的话就返回,不存在就先创建一个在返回。这样就提高了性能。
在游戏开发中:我们可以将一些基本不会变动的属性提取出来作为一个静态类,比如敌人的移动速度,跳跃高度等属性,我们将这些属性封装成一个commonArr类,之后就可以在写enemy类的时候使用组合(一般是composition或者delegation的形式)包含一个commonArr对象和其他易变的属性。
如果使用享元模式,这时候这个commonArr对象是从外部获取的,所有敌人中的commonArr都是同一个对象。
如果不使用享元模式,则每个敌人都要多一个commonArr的size,开销过大。
#pragma once
#include <iostream>
#include <map>
using namespace std;
//享元_base
template<typename T>
class commonArr {
private:
string key;//这就相当于静态类里面的属性,比如跳跃高度,移动速度之类的,可以不是一个,而是一系列,和下面map的第一参数(可以是多参数)对应
public:
commonArr(string k) :key(k) {}
virtual void describe() {}
};
//具体享元
template<typename T>
class concrete_commonArr_1 :public commonArr<T> {
public:
virtual void describe() {
cout << "我是可共享具体享元1" << endl;
}
};
template<typename T>
class Unshared_concrete_commonArr_1 :public commonArr<T> {
public:
virtual void describe() {
cout << "我是不可共享具体享元1" << endl;
}
};
//享元工厂,到时候需要这个接受value值来在pool中寻找对应的享元对象
template<typename T>
class commonArr_factory {
private:
map<string, commonArr<T>*> commonArr_pool;//享元池
public:
commonArr<T>* get_commonArr(string key) {
auto iter = commonArr_pool.find(key);//有的话就返回一个有对象的指针(享元)
if (iter != commonArr_pool.end()) {
cout << "我找到了,直接返回享元" << endl;
return commonArr_pool[key];
}
else {
cout << "我没找到,需要先创建再返回" << endl;
commonArr<T>* CommonArr = new commonArr<T>(key);//没有就先创建再返回(创建一个新享元并返回)这里还可以规定new什么类型的享元。
commonArr_pool.insert(pair(key, CommonArr));
return CommonArr;
}
}
};
测试接口
//测试享元模式
auto CommonArr_Factory = new commonArr_factory<bool>;
auto a_new_commonArr_1 = CommonArr_Factory->get_commonArr("移动速度1");
auto a_new_commonArr_2 = CommonArr_Factory->get_commonArr("移动速度1");
a_new_commonArr_1->describe();
a_new_commonArr_2->describe();
标签:享元,模式,commonArr,key,new,设计模式,public,CommonArr 来源: https://blog.csdn.net/qq_43274123/article/details/122784154