以下代码来源: 设计模式精解-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(结构型模式) 针对 需要创建大量对象的情形,被共享的状态作为内部状态,不被共享的状态作为外部状态的更多相关文章

  1. 设计模式-Facade(结构型模式) 针对 最终类的实现通过一系列类的相关操作,重点关注 起始与结尾的操作。

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Facade.h #pragma once class Subsystem1 { public: Subsystem1() ...

  2. GoF的23种设计模式之结构型模式的特点和分类

    结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足 ...

  3. Go语言实现的23种设计模式之结构型模式

    摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...

  4. Java设计模式之结构型模式

    结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 一.适配器模式: 意图: 将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原本由于接 ...

  5. Java经典23种设计模式之结构型模式(一)

    结构型模式包含7种:适配器模式.桥接模式.组合模式.装饰模式.外观模式.享元模式.代理模式. 本文主要介绍适配器模式和桥接模式. 一.适配器模式(Adapter) 适配器模式事实上非常easy.就像手 ...

  6. GoF23种设计模式之结构型模式之享元模式

    一.概述  运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...

  7. GoF23种设计模式之结构型模式之组合模式

    一.概述 将对象组合成树型结构以表示“部分--整体”的层次关系.组合模式使得用户对单个对象和组合对象的使用具有一致性. 二.适用性 1.你想表示对象的部分--整体层次结构的时候. 2.你希望用户忽略组 ...

  8. GoF23种设计模式之结构型模式之桥接模式

    一.概述         将类的抽象部分与实现分部分离开来,使它们都可以独立地变化. 二.适用性 1.你不希望在抽象和实现之间有一个固定的绑定关系的时候.例如:在程序运行时实现部分应可以被选择或切换. ...

  9. GoF23种设计模式之结构型模式之适配器模式

    一.概述         将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 二.适用性 1.你想使用一个已经存在的类,但是它的接口不符合 ...

随机推荐

  1. C语言——线性表及其应用

    程序要求 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度.2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68.3.建立一 ...

  2. ES6知识点脑图

    点击左键 => 拖拽图片 => 新标签页查看图片 => 放大拖拽查阅

  3. 《Python3 网络爬虫开发实战》开发环境配置过程中踩过的坑

    <Python3 网络爬虫开发实战>学习资料:https://www.cnblogs.com/waiwai14/p/11698175.html 如何从墙内下载Android Studio: ...

  4. Windows添加自定义开机用户登录启动程序

    默认的启动程序 Ctrl+shift -> Esc调用任务管理器-->启动项选项即可完成计算机开机自启动选项,不过这里只有系统默认添加的. 添加自定义开机启动程序 Windows+R调用运 ...

  5. MySQL数据库增删改查等常用命令介绍

    MySQL可以说是最常用的小型数据库,加上现在越来越流行的分布式架构,哪怕是一般的中大型项目也可以用MySQL来进行部署. 数据库的操作最常用的就是增删改查,还有一些切换数据库等操作.以下命令不加说明 ...

  6. PWA 学习笔记(五)

    离线与缓存 资源请求的拦截代理: 1.资源请求的判断: (1)fetch 事件会拦截页面上所有的网络资源请求,但我们通常只对部分资源请求进行处理, 其余的请求会继续走浏览器默认的资源请求流程 (2)f ...

  7. 【2期】JVM必知必会

    JVM之内存结构图文详解 Java8 JVM内存结构变了,永久代到元空间 Java GC垃圾回收机制 不要再问我“Java 垃圾收集器”了 Java虚拟机类加载机制 Java虚拟机类加载器及双亲委派机 ...

  8. git 分布式控制版本管理器(上)

    git的作用: 1.更方便的存储版本 2.恢复之前的版本 3.更方便的对比 4.协同合作 下载地址git官网: https://git-scm.com/ 可自选自己电脑的操作系统 安装: 一路next ...

  9. Luogu P2210 Haywire 题解

    其实这题吧...有一种玄学解法 这题的要求的就是一个最小化的顺序 那么,我们就不进想到了一种显然的写法 就是random_shuffle 什么?这不是乱搞的非正解吗 然而,正如一句话说的好 一个算法, ...

  10. linux-在指定路径下查询文件夹是否存在

    我们常常在Linux下去查找文件 find / -name 'test.py' # 在根目录下查找名为test.py的文件 但是如果用查找文件的方式去查找文件夹的话,是查不到的 find / -max ...