第11章 享元模式(Flyweight Pattern)

原文 第11章 享元模式(Flyweight Pattern)

概述:

 

     面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题。但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价。那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作?享元模式j就可以让我们更好的复用我们内存中已存在的对象,降低系统创建对象实例的性能消耗

   运用共享技术有效地支持大量细粒度的对象。[GOF 《设计模式》]

 

结构图:

 

举例:

    为了方便说清享元模式的核心,我就把其它不相关的代码给去了,就留下核心的代码进行说明

 


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

    //字母基类

    abstract class English

    {

        public abstract void Method();

    }

    //字母A

    class A : English

    {

        public override void Method()

        {

            Console.WriteLine("我是A");

        }

    }

    //字母B

    class B : English

    {

        public override void Method()

        {

            Console.WriteLine("我是B");

        }

    }

    /// <summary>

    /// 享元工厂

    /// </summary>

    class Factory

    {

 

        Dictionary<string, English> list = new Dictionary<string, English>();

 

        public Factory()

        {

            list.Add("A"new A());

            list.Add("B"new B());

        }

        //获取实例

        public English Get(string str)

        {

 

            if (list[str] == null)

            {

                list[str] = (English)Activator.CreateInstance(Type.GetType("享元模式." + str));

 

            }

 

            return list[str];

 

        }

 

    }

     

    //客户端调用

    class Program

    {

        static void Main(string[] args)

        {

            Factory f = new Factory();

            English e = f.Get("A");

            e.Method();

            Console.ReadLine();

        }

    }

 

通过上面的代码,我们可以看到我们调用对象的时候不在是直接new 一个对象了。而是通过调用享元工厂的方法来复用我们内存中已经存在的对象。这样避免了new对象中产生的不必要的开销!

 

单例模式跟享元模式的区别

 

        享元模式是为了节约内存空间,提升程序性能(避免大量的new操作);

        而单例模式则主要是出于共享状态的目的;

        设计模式不用拘泥于具体代码, 代码实现可能有n多种方式, 而单例可以看做是享元的实现方式中的一种, 但是他比享元更加严格的控制了对象的唯一性。

    

适用场景:

 

1、   一个系统有大量的对象。

2、   这些对象耗费大量的内存。

3、   这些对象的状态中的大部分都可以外部化。

4、   这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。

5、   软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。

满足以上的这些条件的系统可以使用享元对象。最后,使用享元模式需要维护一个记录了系统已有的所有享元的表,而这需要耗费资源。因此,应当在有足够多的享元实例可供共享时才值得使用享元模式。

 

 

设计模式系列文章http://www.diyibk.com/post/39.html

时间: 2024-09-13 21:47:53

第11章 享元模式(Flyweight Pattern)的相关文章

乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:webabcd 介绍 运用共享技术有效地支持大量细粒度的对象. 示例 有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支持这些对象. MessageModel using System;using System.Collections.Generic;usi

.net设计模式实例之享元模式( Flyweight Pattern)

一.享元模式简介(Brief Introduction) 享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象. Use sharing to support large numbers of fine-grained objects efficiently. 享元模式可以避免大量非常相似类的开销.在程序设计中有时需要生成大量细粒度的类 实例来表示数据.如果发现这些实例除了几个参数外基本伤都是相同的,有时就能够受大幅 度第减少需要实例化的类的数量.如果能把这些参数

【设计模式】—— 享元模式Flyweight

模式意图 享元模式,也叫[轻量级模式]或者[蝇量级模式].主要目的就是为了减少细粒度资源的消耗.比如,一个编辑器用到大量的字母数字和符号,但是不需要每次都创建一个字母对象,只需要把它放到某个地方共享使用,单独记录每次创建的使用上下文就可以了. 再比如餐馆的桌子,餐具,这些都是享元模式的体现.客户是流动的,每次吃饭都是用饭店固定的那些餐具,而饭店也不需要每次新来顾客,就买新的盘子餐具. 应用场景 1 一个系统应用到了大量的对象,而且很多都是重复的. 2 由于大量对象的使用,造成了存储效率上的开销.

重温设计模式(一)——享元模式(Flyweight)

一.世间万物皆为对象 从大学校园中拦住一个软件工程专业的学生,问他,什么是面向对象.他会告诉你,世间万物皆是对象. 世界之大,何止万物.上至宇宙星辰,下至细菌病毒.皆为对象. 女孩,吐气如兰,仍留淡淡余香. 男孩,闭眼陶醉,不亦乐乎. 二.对象爆炸 呼吸之间,分子无数. 每个分子皆为一对象,恐万台服务器之矩阵亦无可容. 奈何乎? GOF 曰:享元模式! 三.何为享元模式 Flyweight : 次最轻量级的拳击选手.即粒度最小. 因此,享元模式的目的是采用共享技术解决大量细粒度对象的爆炸问题.

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

设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展性或抽象性的问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.比如: 例子1:图形应用中的图元等对象.字处理应用中的字符对象等. 2.解决方案

学习php设计模式 php实现享元模式(flyweight)_php技巧

一.意图运用共享技术有效的支持大量细粒度的对象 享元模式变化的是对象的存储开销二.享元模式结构图 三.享元模式中主要角色抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口.那些需要外蕴状态的操作可以通过调用商业以参数形式传入具体享元(ConcreteFlyweight)角色:实现Flyweight接口,并为内部状态(如果有的话)拉回存储空间.ConcreteFlyweight对象必须是可共享的.它所存储的状态必须是内部的不共享的具体享元(Unsh

设计模式之禅之设计模式-享元模式

一:享元模式定义        --->享元模式(Flyweight Pattern)是池技术的重要实现方式        --->使用共享对象可有效地支持大量的细粒度的对象        --->要求细粒度对象,那么不可避免地使得对象数量多且性质相近,那我们就将些对象的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic).                ● 内部状态                        内部状态是对象可共享出来的信息,存储在享元对象

适配器模式之享元模式

设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox 享元模式 Flyweight Pattern 使用共享对象可有效地支持大量的细粒度的对象 通用类图 组成 抽象享元角色 Flyweight 简单的说就是一个产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现 具体享元角色 ConcreteFlyweight 具体的一个产品类,实现抽象角色定义的业务.该角色中需要注意的是内部状态处理应该与环境无关,不

jdk1.5新特性4之自动装箱和自动拆箱与享元模式

  一 基本概念 1 装箱 把基本类型用它们相应的引用类型包装起来,使其具有对象的性质.如int-->Integer,float-->Float. 自动装箱 Integer a = 100,编译器调用的是static Integer valueOf(int i)                2 拆箱 和装箱相反,将引用类型的对象简化成值类型的数据 自动拆箱 int b = new Integer(100); int c = a +2;   二 是否相等 例一 Integer a = new