以下代码来源: 设计模式精解-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. vue-cli3配置webpack-bundle-analyzer插件

    为优化vue项目性能,需要使用webpack-bundle-analyzer分析报文件,找出最占用空间的插件有哪些,对应做出优化 网上看了一些网站,有的写的太麻烦了,现将最简单的一种写出来供大家参考 ...

  2. 一个神奇的HTML标签-----marquee

    今天无意中发现了一个html标签 - <marquee></marquee>可以实现多种滚动效果,无需js控制. 语法:<marquee>...</marqu ...

  3. JS 算数

    JS 算数 Math(算数)对象的作用是:执行常见的算数任务. random() 来返回 0 到 1 之间的随机数. max() 来返回两个给定的数中的较大的数.(在 ECMASCript v3 之前 ...

  4. Dockerfile编写

    Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建编写命令: 1.FROM作用:声明使用哪个基础镜像格式:FROM IMA ...

  5. Linux(Centos7)下redis5安装、部署、开机自启

    1.什么是redis redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止redis支持的键值数据类型如下字符串 ...

  6. web项目的初始搭建和intellij的tomcat的配置

    点击web application

  7. GithubPages+Hexo博客搭建记录

    目录 前言 安装Node.js 安装Git 安装Hexo 查看效果 建立Github Pages 注册Github帐户 建立托管博客的仓库 制作SSH密钥 添加公钥到Github 测试连接 把本地的博 ...

  8. TKinter当Label绑定bind事件时传参方法

    记录下tkinter的 当在label绑定bind事件时,遇到需要传参时的解决方法(因为有event存在 所以不能直接传参) https://www.cnblogs.com/liyuanhong/ar ...

  9. 【RTOS】基于V7开发板的RTX5和FreeRTOS带CMSIS-RTOS V2封装层的模板例程下载,AC6和AC5两个版本

    说明: 1.使用MDK的RTE环境开发RTX5和FreeRTOS,简单易移植,统一采用CMSIS-RTOS V2封装层. 2.DTCM是H7里面性能最高的RAM,主频400MHz,跟内核速度一样,所以 ...

  10. JSON.parse解决Unexpected token ' in JSON at position 1报错

     壹 ❀ 引 我们知道JSON.parse能将JSON字符串转变成JS对象,但在一些转换中可能出现Unexpected token ' in JSON at position 1的错误,这是因为被转换 ...