C++ 学习笔记(27)Flyweight Pattern

Flyweight Pattern

享元模式

生活中的实例:(1)Word 等文档编辑器中,会出现很多的重复字母,例如“的”,“I”, "you"等,如果出现了 1000 次,就需要生成 1000 个对象(2)LOL 等近亲游戏中,小兵这一角色,数量极多,但它们其实有很多的共同点,不必生成那么多对象(3)围棋中,黑白棋子除了位置不一样,其他特征都是一样的,如果可以共享,就只需要两个实际存储的对象。

测试例子:

#include <iostream>
#include <memory>
#include <string>
#include <map>

namespace Document {
	class Charactor {
	private:
		int x, y;
		int _size;
		int color;
		std::string symbol;
		// ...
	public:
		void display() const {
			std::cout << "位置  :  " << x << "  ,  " << y << std::endl;
			std::cout << "符号  :  " << symbol << std::endl;
			std::cout << "大小  :  " << _size << std::endl;
		}

		void setPos(const int _x, const int _y) {
			x = _x, y = _y;
		}

		void setSize(const int _Size) {
			_size = _Size;
		}

		void setColor(const int _color) {
			color = _color;
		}

		void setSymbol(const std::string _symbol) {
			symbol = _symbol;
		}
	} ;

	class Factory {
		using ptrType = std::shared_ptr<Charactor>;
	private:
		std::map<std::string, ptrType > factory;
	public:
		ptrType getSymbol(const std::string& symbol) {
			auto ans = factory.find(symbol);
			if( ans == factory.end() )
				factory.insert(std::make_pair(symbol, std::make_shared<Charactor>()));
			ans = factory.find(symbol);
			return ans->second;
		}
	};
}

int main() {
	using namespace Document;

	std::shared_ptr<Factory> factory = std::make_shared<Factory>();
	auto letter1 = factory->getSymbol("A");
	auto letter2 = factory->getSymbol("A");
	auto letter3 = factory->getSymbol("A");

	// 验证共享一个对象
	std::cout << letter1.get() << std::endl;
	std::cout << letter2.get() << std::endl;
	std::cout << letter3.get() << std::endl;

	// 实现同一对象, 不同体现
	std::cout << "\n\n-------------- letter1 -------------\n";
	letter1->setPos(3.5, 5);
	letter1->setSize(12);
	letter1->setSymbol("A");
	letter1->display();

	std::cout << "\n\n-------------- letter2 -------------\n";
	letter2->setPos(9, 8);
	letter2->setSize(24);
	letter2->setSymbol("B");
	letter2->display();
	return 0;
}

联想:单例模式,装饰者模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值