首页 > 编程语言 >C++ 设计模式之享元模式

C++ 设计模式之享元模式

时间:2023-07-07 13:55:46浏览次数:38  
标签:享元 状态 map C++ 模式 Flyweight 共享 设计模式

设计模式之享元模式
  享元模式,运用共享技术有效地支持大量细粒度的对象。面向对象技术可以很好地解决一些灵活性或扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正式为了解决这依赖问题而诞生的。享元模式通过共享技术实现相同或相似对象的重用,示意图如下(我们可以公用一个Hello world对象,其中字符串“Hello world”为内部状态,可共享:字体颜色为外部状态,不可共享,由客户端设定)该部分这个bolg写的很好:

  在享元模式中可以共享的相同内容成为内部状态,而那些需要外部环境来设置的不能共享的内容称为外部状态,其中外部状态和内部状态是相互独立的,外部状态的变化不会引起内部状态的变化。由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。也就是说,享元模式的本质是分离与共享:分离变与不变,并且共享不变。把一个独享的状态分为内部状态和外部状态,内部状态即是不变的,外部状态时变化的;然后通过共享不变的部分,达到减少对象数量并节约内存的目的。

  在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(用于存储具有相同内部状态的享元对象)。在享元模式中,共享的是享元对象的内部状态,外部状态需要通过环境来设置。在实际使用中,能够共享的内部状态是有限的,因此享元对象一般都设计为较小的对象,它所包含的内部状态较少,这种对象也成为细粒度对象。比如在C++中的常量字符串。python中的小整数,应该都是这种模式。其UML图如下:

 1 // FlyweightModel.h文件
 2 #pragma once
 3 #include <iostream>
 4 #include <map>
 5 #include <utility>
 6 
 7 class Flyweight
 8 {
 9 public:
10     virtual void Operation(int n) = 0;
11 };
12 
13 class ConcreteFlyweight_0 : public Flyweight
14 {
15 public:
16     void Operation(int n)
17     {
18         std::cout << "ConcreteFlyweight_0:" << n << std::endl;
19     }
20 };
21 
22 class ConcreteFlyweight_1 : public Flyweight
23 {
24 public:
25     void Operation(int n)
26     {
27         std::cout << "ConcreteFlyweight_1:" << n << std::endl;
28     }
29 };
30 
31 class ConcreteFlyweight_2 : public Flyweight
32 {
33 public:
34     void Operation(int n)
35     {
36         std::cout << "ConcreteFlyweight_2:" << n << std::endl;
37     }
38 };
39 // 享元工厂
40 class FlyweightFactory
41 {
42 private:
43     std::map<int, Flyweight *> m_map;
44 public:
45     FlyweightFactory()
46     {
47         m_map.insert(std::pair<int, Flyweight *>(0, new ConcreteFlyweight_0()));
48         m_map.insert(std::pair<int, Flyweight *>(1, new ConcreteFlyweight_1()));
49         m_map.insert(std::pair<int, Flyweight *>(2, new ConcreteFlyweight_2()));
50     }
51     ~FlyweightFactory()
52     {
53         for (auto it = m_map.begin(); it != m_map.end(); it++)
54         {
55             delete it->second;
56         }
57         m_map.clear();
58     }
59     Flyweight * getFlyweight(int n)
60     {
61         return m_map[n];
62     }
63 };

测试代码如下:

 1 #include <iostream>
 2 #include "FlyweightModel.h"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7     // 享元模式
 8     int externState = 0;
 9     FlyweightFactory * p = new FlyweightFactory();
10 
11     Flyweight * f0 = p->getFlyweight(0);
12     f0->Operation(externState++);
13     Flyweight * f1 = p->getFlyweight(1);
14     f1->Operation(externState++);
15     Flyweight * f2 = p->getFlyweight(2);
16     f2->Operation(externState++);
17     Flyweight * f3 = p->getFlyweight(0);
18     f3->Operation(externState++);
19     delete p;
20 
21     getchar();
22     return 0;
23 }

测试结果如下图:

标签:享元,状态,map,C++,模式,Flyweight,共享,设计模式
From: https://www.cnblogs.com/ybqjymy/p/17534767.html

相关文章

  • C++ 设计模式之解释器模式
    设计模式之解释器模式解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建......
  • C/C++数据结构与算法课程设计[2023-07-06]
    C/C++数据结构与算法课程设计[2023-07-06]数据结构与算法课程设计一、课程设计的目的、要求和任务 本课程设计是为了配合《数据结构与算法》课程的开设,通过设计完整的程序,使学生掌握数据结构的应用、算法的编写等基本方法。1.课程的目的(1)使学生进一步理解和掌握课堂上所学......
  • C++ 设计模式之简单工厂模式
    设计模式之简单工厂模式(C++)简单工厂模式,主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。优点:适用于不同情况创建不同的类时。缺点:客户端必须要知道基类和工厂类,耦合性差......
  • C++ 设计模式之组合模式
    设计模式之组合模式组合模式,将对象组合成属性结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。其UML图如下:一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。......
  • C++ 设计模式之单例模式
    设计模式之单例模式保证一个类仅有一个实例,并提供一个访问他的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且可以提供一个访问该实例......
  • C++学生健康信息收集系统[2023-07-06]
    C++学生健康信息收集系统[2023-07-06]学生健康信息收集系统简介一、 问题描述为了应对新型冠状病毒疫情,学校需要开发一个能够每天收集全校学生健康信息的系统,便于学校管理。不同学院以及学校的管理员,需要能方便地查看和导出健康状况异常的学生列表,并能对各类信息进行查看和统计......
  • C/C++学生通讯录管理系统[2023-07-06]
    C/C++学生通讯录管理系统[2023-07-06]一、设计要求1、题目利用C++语言实现一个学生通讯录管理系统,系统中需要实现的功能如下:(1)添加学生信息:向通讯录中添加新人,信息包括(学生姓名、性别、年龄、联系电话、家庭住址等),最多记录100人。(2)显示学生信息:显示通讯录中所有学生信息。(3)删......
  • C++ 设计模式之桥接模式
    设计模式之桥接模式桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里说的实现分离,并不是说然抽象类与派生类分离,这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。其UML图如下: 结合上图理解一下其定义。抽象部分指的是Abstraction......
  • C/C++订餐管理系统[2023-07-07]
    C/C++订餐管理系统[2023-07-07]1、订餐管理系统要求实现饭店的订餐信息管理,包括菜单管理、订单管理、统计分析。实现菜单信息(菜号、菜名、价格、成本)的增删改查;实现订单管理(订单号、就餐人数、下单时间、订单总价、订单包含的所有菜品(菜号、数量))。系统功能包括以下方面:A、菜......
  • 学习C++这一篇就够了(进阶篇)
    ​内存模型C++在执行程序的时候,将内存方向划分为4个区域:代码区:存放二进制代码,由操作系统进行管理全局区:存放全局变量、静态变量、常量,程序结束后由操作系统释放栈区:存放函数参数、局部变量,由编译器自动分配和释放堆区:由开发者申请分配和释放,若程序员不释放,程序结束由......