ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式:享元模式

2022-02-04 17:05:49  阅读:127  来源: 互联网

标签:享元 模式 commonArr key new 设计模式 public CommonArr


回答了对纯粹对象方案(就是万物皆对象)在设计大量细粒度对象时候的性能问题,比如字符的字体属性,按说每个字符都需要有字体属性,但是一篇文章一共就几种字体,如果对每个字符都单独设置一个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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有