现在在大力推行节约型社会,“浪费可耻,节俭光荣”。在软件系统中,有时候也会存在资源浪费的情况,例如,在计算机内存中存储了多个完全相同或者非常相似的对象,如果这些对象的数量太多将导致系统运行代价过高。那么,是否存在一种技术可以用于节约内存使用空间,实现对这些相同或者相似对象的共享访问呢?答案是肯定的,这种技术就是享元模式。

一 享元模式概述

1.1 享元模式简介

享元(Flyweight)模式:运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,是一种结构型模式。

1.2 享元模式需求

  M公司开发部欲开发一个围棋软件,其界面效果如下图所示:

  M公司开发人员通过对围棋软件进行分析,发现在围棋棋盘中包含大量的黑子和白子,它们的形状、大小都一模一样,只是出现的位置不同而已。如果将每一个棋子都作为一个独立的对象存储在内存中,将可能导致该围棋软件在运行时所需要的内存空间较大。

  如何降低运行代价、提高系统性能是M公司开发人员需要解决的一个问题。为此,M公司开发人员决定使用享元模式来设计该软件。

1.3 类图

  

1.4 代码实现

1.4.1 抽象棋子类

#pragma once#include <string>
#include <iostream>
using namespace std;
class AbstractPiece
{
public:AbstractPiece(){}~AbstractPiece(){}virtual string GetColor() = 0;virtual void Display(CCoordinates *pCoodinates) = 0;
};

1.4.2 白色棋子类

class WritePiece : public AbstractPiece
{
public:WritePiece(){cout << "WritePiece Construct" << endl;}~WritePiece(){cout << "WritePiece Deconstruct" << endl;}string GetColor(){return "white";}void Display(CCoordinates *pCoodinates){cout << "棋子颜色:"<< GetColor() << "," << "棋子坐标:" << pCoodinates->m_x << "," << pCoodinates->m_y << endl;}
};

1.4.5 黑色棋子类

class BlackPiece : public AbstractPiece
{
public:BlackPiece(){cout << "BlackPiece Construct" << endl;}~BlackPiece(){cout << "BlackPiece Deconstruct" << endl;}string GetColor(){return "black";}void Display(CCoordinates *pCoodinates){cout << "棋子颜色:"<< GetColor() << "," << "棋子坐标:" << pCoodinates->m_x << "," << pCoodinates->m_y << endl;}
};

1.4.6 棋子外部状态类

class CCoordinates
{
public:CCoordinates(int x, int y){m_x = x;m_y = y;}~CCoordinates(){}public:int m_x;int m_y;
};

1.4.7 棋子工厂类(单例)

#pragma once#include "flyweight.h"
#include <map>
using namespace std;class CPieceFactor
{
private:CPieceFactor();~CPieceFactor();public://static CPieceFactor* GetPieceFactorInstance();static AbstractPiece* CreatePiece( string strColor );
private:typedef map<string, AbstractPiece*> PIECEMAP;static PIECEMAP m_PieceVect;static CPieceFactor *m_pPieceFactor;
};

#include "PieceFactor.h"// 饥饿模式的单例模式
CPieceFactor::PIECEMAP CPieceFactor::m_PieceVect;
CPieceFactor * CPieceFactor::m_pPieceFactor = new CPieceFactor();
CPieceFactor::CPieceFactor()
{AbstractPiece *pWrite = new WritePiece();m_PieceVect.insert(make_pair<string, AbstractPiece*>("write", pWrite));AbstractPiece *pBlack = new BlackPiece();m_PieceVect.insert(make_pair<string, AbstractPiece*>("black", pBlack));
}CPieceFactor::~CPieceFactor()
{PIECEMAP::iterator iter;for (iter = m_PieceVect.begin(); iter != m_PieceVect.end(); iter ++){delete iter->second;}
}AbstractPiece* CPieceFactor::CreatePiece( string strColor )
{return m_PieceVect[strColor];
}

1.5 测试

#include "stdio.h"#include "PieceFactor.h"void main()
{// 通过享元工厂获取3颗黑子AbstractPiece *pPiece1 = CPieceFactor::CreatePiece("black");AbstractPiece *pPiece2 = CPieceFactor::CreatePiece("black");AbstractPiece *pPiece3 = CPieceFactor::CreatePiece("black");string strCmp;strCmp = pPiece1 == pPiece2 ? "相同":"不相同";cout << "判断两颗黑子是否相同:" << strCmp.c_str() <<endl;// 通过享元工厂获取2颗白子AbstractPiece *pPiece4 = CPieceFactor::CreatePiece("write");AbstractPiece *pPiece5 = CPieceFactor::CreatePiece("write");strCmp = pPiece1 == pPiece2 ? "相同":"不相同";cout << "判断两颗白字是否相同:" << strCmp.c_str() <<endl;// 显示棋子pPiece1->Display(new CCoordinates(1,2));pPiece2->Display(new CCoordinates(3, 4));pPiece3->Display(new CCoordinates(1, 3));pPiece4->Display(new CCoordinates(2, 5));pPiece5->Display(new CCoordinates(2, 4));return;
}

二 享元模式总结

2.1 主要优点

  可以极大减少内存中对象的数量,使得相同或相似对象在内存中只有一份 => 节省系统资源,提高系统性能!棒棒哒!

2.2 主要缺点

  为了使对象可以共享,享元模式需要将享元对象的部分状态外部化,而读取外部状态将使得运行时间变长!

2.3 应用场景

  (1)一个系统有大量相同或相似的对象,造成了系统内存的大量损耗 => 赶紧使用享元模式吧!

  (2)对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。

  (3)要维护享元模式,需要耗费一定的系统资源,因为在需要时会多次重复使用才值得使用享元模式了!

转载于:https://www.cnblogs.com/xiaobingqianrui/p/9023602.html

设计模式之享元(flyweight)模式相关推荐

  1. python 享元模式_python 设计模式之享元(Flyweight)模式

    #写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...

  2. Java设计模式之享元flyweight模式代码示例

  3. 设计模式学习笔记——享元(Flyweight)模式

    设计模式学习笔记--享元(Flyweight)模式 @(设计模式)[设计模式, 享元模式, flyweight] 设计模式学习笔记享元Flyweight模式 基本介绍 享元案例 类图 实现代码 Big ...

  4. Java 实现享元(Flyweight)模式

    /*** 字母* @author stone**/ public class Letter {private String name;public Letter(String name) {this. ...

  5. 设计模式学习笔记--享元(Flyweight)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...

  6. 设计模式--享元(Flyweight)模式

    模式定义 运用共享技术有效地支持大量细粒度的对象 类图 应用场景 如果系统有大量类似的对象,可以使用享元模式 优点 如果系统有大量类似的对象,可以节省大量的内存及CPU资源 要点总结 要点总结 如果系 ...

  7. java 地图模式_Java设计模式之从[Dota地图]分析享元(Flyweight)模式

    在Dota游戏的地图中有几百棵树,现在假设这些树木无非是这两种:白杨.枫树,数量一共为400棵,那么,在装载这个地图场景的时候,我们是不是应该给这400课树一一建立对象呢?(如:MapItem tre ...

  8. 设计模式(11)——享元(Flyweight)模式

    什么是享元模式? 享元模式跟CACHE机制类似,它运用共享技术有效地支持大量细粒度的对象.Flyweight通过尽可能地与其他对象共享数据来减少对内存的使用. Flyweight的经典例子就是字符处理 ...

  9. 设计模式:享元(FlyWeight)模式

    设计模式:享元(FlyWeight)模式 一.前言     享元(FlyWeight)模式顾名思义,既是轻量级的,原因就是享元,共享元素,这里的元素指的是对象.如何共享对象,那就是在检测对象产生的时候 ...

  10. 北风设计模式课程---享元模式

    北风设计模式课程---享元模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式的本质是什么? 池技术:各种缓存池都是享元模式的体现 说到享元模 ...

最新文章

  1. 软件性能-概念、关注点、术语
  2. SharePoint 2007讨论板(Discussion Board)的答复按钮变脸
  3. linux知识(二)互斥量、信号量和生产者消费者模型
  4. 用sqlserver手动写个split(字符分割)
  5. 参数pyinstaller_Python用PyInstaller打包笔记
  6. Spring Boot这只怪物到底是如何跑起来的?
  7. JScript中的条件注释详解(转载自网络)
  8. iOS-从三维立方体到理解CATransform3DCGAffineTransformm34
  9. LR11安装报错:此计算机上缺少vc2005_sp1_with_atl_fix_redist,请安装所有缺少的必要组件,然后重新运行此安装。
  10. 英语单词发音中/s/后的/p/,/t/,/k//tr/什么时候读作/b/,/d/,/g/,/dr/?
  11. oracle数据库interval使用,Oracle Interval类型
  12. 优动漫PAINT基础系列之图层模式
  13. 服务器硬盘用在硬盘录像机,网络硬盘录像机是干什么用的
  14. 2018年博客之星评选,No 138号“铭毅天下”需要您宝贵的一票,万分感谢!
  15. 老司机 iOS 周报 #48 | 2018-12-17
  16. UniAPP Android 蓝牙 ESCPOS打印机 打印图片和二维码
  17. vscode使用小技巧
  18. 【python】PyQt6和pyqt6-tools在PyCharm2021的详细配置方法
  19. 分享一开源的闭环步进电机控制器
  20. 2-4_Date_Type_analysis

热门文章

  1. php生成字母数字订单,php生成唯一订单号可控制位数字母和数字
  2. linux系统下c语言程序需要改动的地方,如何在Linux系统环境下进行C语言开发
  3. python threading.Semaphore
  4. python `__del__`
  5. 编程通用知识 系统编程
  6. sqlalchemy 初始化数据库
  7. Java基础学习总结(129)——Arrays.asList得到的List进行add和remove等操作出现异常解析
  8. 代码管理和检查平台汇总
  9. Spring Boot学习总结(2)——Spring Boot整合Jsp
  10. Java基础学习总结(38)——Lombok(消除冗长的 java 代码)的使用和原理及安装、入门使用