栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

设计模式学习笔记(8)——享元模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式学习笔记(8)——享元模式

先看定义:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。

初步理解为为减少创建对象开销,共享已存在对象,什么叫共享已存在的对象,这概念够抽象的,通过阅读csdn里面很多作者给的例子,嗯,说实话,大部分也挺裹得,这让我更糊涂了。嗯,功夫不负有心人,终于找到一个认为写的很清晰、贴切的例子了。

直接上代码

#include 
#include 
#include 
#include 

using namespace std;
//抽象享元类NetworkDevice
class NetworkDevice {
public:
	virtual string getType() = 0;
	virtual void use() = 0;
};

//具体享元类Switch
class Switch : public NetworkDevice {
public:
	Switch(string type) {
		this->type = type;
	}

	string getType() {
		return this->type;
	}

	void use() {
		cout << "linked by switch,type is " << this->type << endl;
	}
private:
	string type;
};

//具体享元类Hub
class Hub : public NetworkDevice {
public:
	Hub(string type) {
		this->type = type;
	}

	string getType() {
		return this->type;
	}

	void use() {
		cout << "linked by Hub,type is " << this->type << endl;
	}
private:
	string type;
};

//享元类工厂类DeviceFactory
class DeviceFactory {
public:
	DeviceFactory() {
		shared_ptr nd1 = make_shared("Ciso-WS-C2950-24");
		devices.insert(make_pair("cisco", nd1));
		shared_ptr nd2 = make_shared("TP-link-HF8M");
		devices.insert(make_pair("tp", nd2));
	}

	shared_ptr getNetworkDevice(string type) {
		if (devices.count(type)) {
			totalTerminal++;
			return devices.find(type)->second;
		}
		else {
			return nullptr;
		}
	}

	int getTotalDevice() {
		return devices.size();
	}

	int getTotalTerminal() {
		return totalTerminal;
	}
private:
	map > devices;
	int totalTerminal = 0;
};

//客户端测试 
int main(void) {
	shared_ptr nd1, nd2, nd3, nd4, nd5;
	shared_ptr df = make_shared();

	nd1 = df->getNetworkDevice("cisco");
	nd1->use();

	nd2 = df->getNetworkDevice("cisco");
	nd2->use();

	nd3 = df->getNetworkDevice("cisco");
	nd3->use();

	nd4 = df->getNetworkDevice("tp");
	nd4->use();

	nd5 = df->getNetworkDevice("tp");
	nd5->use();

	cout << "Total Device: " << df->getTotalDevice() << endl;
	cout << "Total terminal: " << df->getTotalTerminal() << endl;
	system("pause");
	return 0;
}

简单说一下代码,熟悉的虚基类,对应子类,重点是工厂类DeviceFactory,里面有个map容器map > devices;看下调用,享元对象都是通过工厂类接口创建,5个享元对象,实际只创建两个map容器里的对象就完成了。看到这里就明白了,享元模式是这么一回事。

关键点是对象池,享元对象都通过工厂类接口创建,所有对象都在对象池中,如果有同类型对象创建时,直接取对象池对象使用,不用额外重新创建了,这样就达到了复用、减少空间消耗的目的了。相对应的也会增加创建时从对象池里取对象的消耗,应该取什么对象,对象池创建的数据形式,这都需要对数据形式有一个很高的认知理解。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604015.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号