12 结构型模式-----享元模式

模式动机(Flyweight Pattern)顾名思义,享元模式就是运用共享技术解决大量细粒度对象的复用问题。在享元模式中,由工厂负责维护一个享元池(Flyweight Pool),用于存储具有相同内部状态的一些对象。所谓内部状态,是指一个对象的特征,我们把大多数该类对象的不变特征确定为共享特征,将其抽象为一个类放到享元池中,对于可变的部分可以通过外部状态参数传入来解决。这样的话,如果客户要使用该类型的对象,只需通过工厂从享元池中取出即可,只有在享元池中不存在的对象才会被工厂创建出来。

模式结构图:

模式代码:

bt_享元模式.h

 1 #ifndef FP_H
 2 #define FP_H
 3 #include <iostream>
 4 #include <map>
 5 using namespace std;
 6
 7 /*
 8     抽象享元接口,用于接受外部状态
 9 */
10 class Flyweight
11 {
12 public:
13     virtual ~Flyweight(){ }
14     virtual void Operation(string extrinsicState) = 0;
15 };
16
17 /*
18     包含共享内部状态的具体享元类
19 */
20 class ConcreteFlyweight : public Flyweight
21 {
22 public:
23     ConcreteFlyweight(){ intrinsicState = "intrinsic state"; }
24     virtual void Operation(string extrinsicState)
25     {
26         cout << "使用共享内部状态:" << intrinsicState << endl;
27         cout << "根据外部状态[ " << extrinsicState << " ]来进行工作" << endl;
28     }
29
30 private:
31     string intrinsicState;              // 共享的内部状态
32 };
33
34 /*
35     非共享具体享元类,其中包含了不能共享的内部状态
36 */
37 class UnsharedConcreteFlyweight : public Flyweight
38 {
39 public:
40     UnsharedConcreteFlyweight()
41     {
42         intrinsicState = "intrinsic state";
43         unSharedState = "unShared state";
44     }
45     virtual void Operation(string extrinsicState)
46     {
47         cout << "使用共享内部状态:" << intrinsicState << endl;
48         cout << "根据外部状态[ " << extrinsicState << " ]来进行工作" << endl;
49         cout << "直接使用非共享内部状态:" << unSharedState << endl;
50     }
51
52 private:
53     string intrinsicState;         // 共享的内部状态
54     string unSharedState;          // 不能共享的内部状态
55 };
56
57 /*
58     享元工厂类,用于创建并管理享元对象
59 */
60 class FlyweightFactory
61 {
62 public:
63     Flyweight* GetFlyweight(string key)
64     {
65         if(flyweights.find(key) == flyweights.end())
66         {
67             cout << ">>>共享池中不存在该类型的对象,正在创建中..." << endl;
68             Flyweight* fw = new ConcreteFlyweight;
69             flyweights.insert(make_pair(key, fw));
70             return fw;
71         }
72         else
73         {
74             cout << ">>>共享池中已有该类型对象,可以立即使用" << endl;
75             return flyweights[key];
76         }
77     }
78
79 private:
80     map<string, Flyweight*> flyweights;
81 };
82
83 #endif // FP_H

测试用例.cpp

 1 #include "bt_享元模式.h"
 2
 3 int main()
 4 {
 5     cout << "***** 享元模式测试 *****" << endl;
 6
 7     cout << endl;
 8     FlyweightFactory* ff = new FlyweightFactory;
 9     Flyweight* fw = ff->GetFlyweight("benxin");          // 第一次创建时不存在该对象
10     fw->Operation("tuzi");
11
12     cout << endl;
13     Flyweight* fw2 = ff->GetFlyweight("benxin");       // 第二次创建时直接返回该对象
14     fw2->Operation("tuzi");
15
16
17     cout << endl;
18     cout << "<<<直接使用非共享具体享元状态>>>" << endl;    // 非共享内部状态可以直接实例化来使用
19     Flyweight* fw3 = new UnsharedConcreteFlyweight;
20     fw3->Operation("tuzi");
21
22     delete fw3;
23     delete fw;
24     delete ff;
25
26   return 0;
27 }

模式分析:

1>  享元模式中,选择频繁使用的类作为享元类,因为系统调用工厂也要产生时间上的开销,使用享元模式必须确保节约的空间开销是值得的;

2>  只有不会随着使用环境改变的状态才可以被设为共享状态;有些状态虽为内部状态,但是并不适合共享,对于这类状态,客户可以越过工厂直接实例化进行使用。

3>  享元模式的使用情况主要存在于系统中需要重复使用相同或类似的对象,如果每次都重复创建,可能会消耗大量内存空间,比如,文档编辑器中的字符类就适合作为享元类,而字符的位置参数适合作为外部状态使用,这样就可以加快文档的处理速度。

时间: 2024-10-12 07:24:28

12 结构型模式-----享元模式的相关文章

&quot;围观&quot;设计模式(17)--结构型之享元模式(Flyweight Pattern)

享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存.通常物件中的部分状态是可以分享.常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元.----WIKIPEDIA 个人理解 共享,内存消耗大的时候应考虑对象的共享,共享对象可以减少对象的生成数量,这样可以减少内存的消耗,当一个对象和其他的对象存在共性且内容一致的时候,可以将共有

设计模式(结构型)之享元模式(Flyweight Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之外观模式(Facade Pattern)>http://blog.csdn.net/yanbober/article/details/45476527 概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题.所以需要采用一

《精通Python设计模式》学习结构型之享元模式

这个我日常当中也没有用到过, 真的是游戏行业用得多些? 学习一下, 有个印象. import random from enum import Enum TreeType = Enum('TreeTye', 'apple_tree cherry_tree peach_tree') class Tree: pool = dict() def __new__(cls, tree_type): obj = cls.pool.get(tree_type, None) if not obj: obj = o

结构型模式 享元模式

结构型模式 享元模式 抽象享元角色:        所有具体享元类的父类,规定一些需要实现的公共接口. 具体享元角色:         抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法.享元工厂角色:         负责创建和管理享元角色. 使用场景:         是以共享的方式,高效的支持大量的细粒度的对象. /** * 结构型模式 享元模式 * Flyweight模式也叫享元模式,是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用. * */ #define _CRT

设计模式--组合模式&amp;享元模式&amp;桥梁模式

一.组合模式 组合模式也叫作部分-整体模式,其定义如下:将对象组合成树形结构以表示"部分"和"整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 组合模式的优点和使用场景 优点:1.节点增加和减少是非常自由和方便的,这也是树形结构的一大特点:2.所有节点,不管是分支节点还是叶子结点,不管是调用一个结点,还是调用一个结点群,都是非常方便的.使用场景:1.维护部分与整体的逻辑关系,或者动态调用整体或部分的功能接口,可以考虑使用组合模式.例如,非常多的操作系

Java设计模式(六)合成模式 享元模式

(十一)合成模式 Composite 合成模式是一组对象的组合,这些对象可以是容器对象,也可以是单对象.组对象允许包含单对象,也可以包含其他组对象,要为组合对象和单对象定义共同的行为.合成模式的意义是 保证客户端调用单对象与组合对象的一致性. class TreeNode{ private String name; private TreeNode parent; private Vector<TreeNode> children = new Vector<TreeNode>();

Java共享模式/享元模式(Flyweight模式)

Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可能显得很庞大,比如,字处理软件,如果以每个文字都作为一个对象,几千个字,对象数就是几千,无疑耗费内存,那么我们还是要"求同存异",找出这些对象群的共同点,设计一个元类,封装可以被共享的类,另外,还有一些特性是取决于应用(context),是不可共享的,这也Flyweight中两个重要概念内

第13章 结构型模式—享元模式

1. 享元模式(Flyweight Pattern)的定义 (1)运用共享技术高效地支持大量细粒度的对象 ①对象内部状态:数据不变且重复出现,这部分不会随环境变化而改变,是可以共享的. ②对象外部状态:数据是变化的,会随环境变化而改变,是不可以共享的. ③所谓的享元,就是把内部状态的数据分离出来共享,通过共享享元对象,可以减少对内存的占用.把外部状态分离出来,放到外部,让应用程序在使用的时候进行维护,并在需要的时候传递给享元对象使用. ④享元模式真正缓存和共享的是享元的内部状态,而外部状态是不被

设计模式(28)-----结构型模式-----享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象.我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式.由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象.这里只有5个对象的. 介绍 意图:运用共享技术有效地支持大量细粒度的对象. 主