C++设计模式-享元(Flyweight)

目录

C++设计模式-享元(Flyweight)

一、意图

二、适用性

三、结构

四、参与者

五、代码


C++设计模式-享元(Flyweight)

一、意图

运用共享技术有效地支持大量细粒度的对象。

二、适用性

  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量的对象,造成很大的存储开销。
  • 对象的大多数状态都可变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

三、结构

四、参与者

  • Flyweight

描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。

  • ConcreteFlyweight

实现Flyweight接口,并为内部状态(如果有的话)增加存储空间。ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。

  • UnsharedConcreteFlyweight

并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。

  • FlyweightFactory

创建并管理flyweight对象。

确保合理地共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。

  • Client

维持一个对flyweight的引用。

计算或存储一个(多个)flyweight的外部状态。

五、代码

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

class Flyweight {
public:
	Flyweight(string tempIntrinsicState) {
		this->intrinsicState = tempIntrinsicState;
	}
	string GetIntrinsicState() {
		return intrinsicState;
	}
	virtual void Operation(const string& tempExtrinsicState) = 0;
private:
	string intrinsicState;
};

class ConcreteFlyweight :public Flyweight {
public:
	ConcreteFlyweight(string tempIntrinsicState) :Flyweight(tempIntrinsicState) {}
	void Operation(const string& tempExtrinsicState) {
		cout << this->GetIntrinsicState() << endl;
		cout << tempExtrinsicState << endl;
	}
};

class UnsharedConcreteFlyweight : public Flyweight {
public:
	UnsharedConcreteFlyweight(string tempIntrinsicState) :Flyweight(tempIntrinsicState) {}
	void UnsharedConcreteOperation(const string& tempExtrinsicState) {
		cout << tempExtrinsicState << endl;
	}
};

class FlyweightFactory {
public:
	Flyweight* GetFlyweight(string state) {
		vector<Flyweight*>::iterator it = this->flyweightVector.begin();
		for (; it != this->flyweightVector.end(); it++) {
			if ((*it)->GetIntrinsicState() == state) {
				return *it;
			}
		}
		Flyweight* flyweight = new ConcreteFlyweight(state);

		this->flyweightVector.push_back(flyweight);

		return flyweight;
	}

	int GetFlyweightCount() {
		return this->flyweightVector.size();
	}
private:
	vector<Flyweight*> flyweightVector;
};

int main() {
	string extrinsicState = "ExtrinsicState";

	FlyweightFactory* flyweightFactory = new FlyweightFactory();

	Flyweight* flyweight1 = flyweightFactory->GetFlyweight("AAA");
	Flyweight* flyweight2 = flyweightFactory->GetFlyweight("AAA");
	Flyweight* flyweight3 = flyweightFactory->GetFlyweight("BBB");

	flyweight1->Operation(extrinsicState);

	cout << flyweightFactory->GetFlyweightCount() << endl;

	cout << (flyweight1 == flyweight2) << endl;

	return 0;
}
相关推荐
Marst Code6 小时前
Python 3.9 已停止维护!从 3.9 到 3.14 全版本深度对比,生产环境该选哪个?
开发语言·python
ZJH__GO6 小时前
网络编程v2--多客户端互通
java·运维·服务器·开发语言·计算机网络
zhangfeng11337 小时前
Ascendc 大语言模型框架 AscendCraft 和pypto 的区别 pypto生成算子c++源码吗
c++·人工智能·语言模型·算子开发
万岳科技系统开发7 小时前
智慧医院小程序开发推动医疗服务流程全面线上化
大数据·开发语言·人工智能
一只小灿灿7 小时前
C++ 修饰符全面详解
开发语言·c++
马里马里奥-7 小时前
从零搭建AI Agent工具链的技术文章大纲
开发语言·qt
code_pgf7 小时前
C/C++ 中 `typedef` 关键字详解
c语言·c++
不做Java程序猿好多年8 小时前
Java中 String、StringBuffer、StringBuilder 的区别详解
开发语言·python
会周易的程序员8 小时前
js-shm: 高性能 Node.js 共享内存模块
开发语言·javascript·c++·node.js·共享内存·shm
笨蛋不要掉眼泪8 小时前
Java虚拟机:常用参数
java·开发语言·python