设计模式-FlyWeight(结构型模式) 针对 需要创建大量对象的情形,被共享的状态作为内部状态,不被共享的状态作为外部状态
以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码
//Flyweight.h
- #pragma once
- #include<string>
- class FlyWeight
- {
- public:
- virtual ~FlyWeight();
- virtual void Operation(const std::string & extrinsicState);
- std::string GetIntrinsicState();
- protected:
- FlyWeight(std::string intrinsicState);
- private:
- std::string _intrinsicState;
- };
- class ConcreateFlyWeight :public FlyWeight
- {
- public:
- ConcreateFlyWeight(std::string intrinsicState);
- ~ConcreateFlyWeight();
- void Operation(const std::string& extrinsicState);
- protected:
- private:
- };
//Flyweight.cpp
- #include"Flyweight.h"
- #include<iostream>
- FlyWeight::FlyWeight(std::string intrinsicState)
- {
- this->_intrinsicState = intrinsicState;
- }
- FlyWeight::~FlyWeight(){}
- void FlyWeight::Operation(const std::string& extrinsicState)
- {
- }
- std::string FlyWeight::GetIntrinsicState()
- {
- return this->_intrinsicState;
- }
- ConcreateFlyWeight::ConcreateFlyWeight(std::string intrinsicState) :FlyWeight(intrinsicState)
- {
- std::cout << "ConcreateFlyWeight Build..." << intrinsicState << std::endl;
- }
- ConcreateFlyWeight::~ConcreateFlyWeight(){}
- void ConcreateFlyWeight::Operation(const std::string& extrinsicState)
- {
- std::cout << "ConcreateFlyWeight:内部[" << this->GetIntrinsicState() << "]外部[" << extrinsicState << "]" << std::endl;
- }
//FlyWeightFactory.h
- #pragma once
- #include"Flyweight.h"
- #include<vector>
- #include<string>
- class FlyWeightFactory
- {
- public:
- FlyWeightFactory();
- ~FlyWeightFactory();
- FlyWeight* GetFlyWeight(const std::string& key);
- protected:
- private:
- std::vector<FlyWeight*>_fly;
- };
//FlyWeightFactory.cpp
- #include"FlyWeightFactory.h"
- #include<iostream>
- #include<string>
- FlyWeightFactory::FlyWeightFactory(){}
- FlyWeightFactory::~FlyWeightFactory(){}
- FlyWeight* FlyWeightFactory::GetFlyWeight(const std::string& key)
- {
- for (std::vector<FlyWeight*>::iterator it = _fly.begin(); it != _fly.end(); ++it)
- {
- if ((*it)->GetIntrinsicState() == key)
- {
- std::cout << "Already created by users..." << std::endl;
- return *it;
- }
- }
- FlyWeight* fn = new ConcreateFlyWeight(key);
- _fly.push_back(fn);
- return fn;
- }
//main.cpp
- #include"Flyweight.h"
- #include"FlyWeightFactory.h"
- #include<string>
- int main(int args, char* argv)
- {
- FlyWeightFactory* flyfac = new FlyWeightFactory();
- FlyWeight* fw1 = flyfac->GetFlyWeight("Hello");
- FlyWeight* fw2 = flyfac->GetFlyWeight("World");
- FlyWeight* fw3 = flyfac->GetFlyWeight("Hello");
- getchar();
- return ;
- }
设计模式-FlyWeight(结构型模式) 针对 需要创建大量对象的情形,被共享的状态作为内部状态,不被共享的状态作为外部状态的更多相关文章
- 设计模式-Facade(结构型模式) 针对 最终类的实现通过一系列类的相关操作,重点关注 起始与结尾的操作。
以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Facade.h #pragma once class Subsystem1 { public: Subsystem1() ...
- GoF的23种设计模式之结构型模式的特点和分类
结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...
- Go语言实现的23种设计模式之结构型模式
摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...
- Java设计模式之结构型模式
结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 一.适配器模式: 意图: 将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原本由于接 ...
- Java经典23种设计模式之结构型模式(一)
结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...
- GoF23种设计模式之结构型模式之享元模式
一.概述 运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...
- GoF23种设计模式之结构型模式之组合模式
一.概述 将对象组合成树型结构以表示“部分--整体”的层次关系.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 1.你想表示对象的部分--整体层次结构的时候. 2.你希望用户忽略组 ...
- GoF23种设计模式之结构型模式之桥接模式
一.概述 将类的抽象部分与实现分部分离开来,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和实现之间有一个固定的绑定关系的时候.例如:在程序运行时实现部分应可以被选择或切换. ...
- GoF23种设计模式之结构型模式之适配器模式
一.概述 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,但是它的接口不符合 ...
随机推荐
- 关于 IIS Express 常用设置
关于 IIS Express 常用设置 站点绑定 IIS Express Web 服务器默认只绑定了 localhost 的主机名,这就意味着无法通过内网或其他自定义域名进行访问,可通过如下操作添加其 ...
- JavaScript for 、for...of 、for...in 等 iteration 效率测试
由于不同浏览器,不同版本性能不一,且控制台本质是是套用了一大堆eval,沙盒化程度高,所以需使用node环境测试来提高准确性 // 准备待测数组 const NUM = 1e7; let arr = ...
- MyBatis中@MapKey使用详解
MyBatis中@MapKey使用详解我们在上一篇文章中讲到在Select返回类型中是返回Map时,是对方法中是否存在注解@MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对象 ...
- Ubuntu16.04 GTX750安装CUDA9.0,Pytorch,Anaconda教程
Ubuntu16 GTX750安装CUDA9.0,Pytorch,Anaconda教程 安装前警告 不要使用Ubuntu18! 不要使用Ubuntu18! 不要使用Ubuntu18! 务必重装成Ubu ...
- String对象及正则表达式
1,String和string还是有区别的,一个就是用双引号或单引号包括起来的数据就是字符串,另一个本质是数组多个字符串组成的只读字符数组: 2,你说string他是数组吧,他和数组还是有点区别的,他 ...
- 安装swoole出现make报错的原因与解决方法
安装swoole报错,错误信息如下: 报错原因 报错很明显,找不到 openssl/ssl.h ,首先要确认电脑上有没有安装 openssl Mac安装openssl 既然它找不到,那么就需要手动的指 ...
- linux命令-开关机命令与系统痕迹命令
一.关机和重启命令 1.sync 命令 命令名称:sync 英文原意:flush file system buffers 所在路径:/bin/sync 执行权限:所有用户 功能描述:刷新文件系统缓冲区 ...
- sql server报【将截断字符串或二进制数据】错误
会出现这个错误的原因是因为表设置的列长度小于要插入的数据的长度. 可以从下列的6个方面去排查: 1.表设置的列名长度太短. 2.插入的数据太长. 3.有默认值. 4.有触发器. 5 从char数据类型 ...
- mybatis无效比较:invalid comparison:java.util.data and java.lang.string
原因: 时间与空字符串比较是无效的,如果拿传入的时间类型参数与空字符串''进行对比则会引发invalid comparison:java.util.data and java.lang.string异 ...
- 自学_JAVASCRIPT<四>
自学_JAVASCRIPT 什么是JAVASCRIPT HTML只是描述网页长相的标记语言,没有计算.判断能力,如果所有计算.判断(比如判断文本框是否为空.判断两次密码是否输入一致)都放到服务器端执行 ...