设计模式——享元模式

名称Flyweight
结构 flyweights.gif
意图运用共享技术有效地支持大量细粒度的对象。
适用性
  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量的对象,造成很大的存储开销。
  • 对象的大多数状态都可变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖于对象标识。由于F l y w e i g h t 对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。
Code Example
 1 None.gif //  Flyweight
 2 None.gif
 3 None.gif //  Intent: "Use sharing to support large numbers of fine-grained objects effectively". 
 4 None.gif
 5 None.gif //  For further information, read "Design Patterns", p195, Gamma et al.,
 6 None.gif //  Addison-Wesley, ISBN:0-201-63361-2
 7 None.gif
 8 ExpandedBlockStart.gifContractedBlock.gif /**/ /* Notes:
 9InBlock.gif * Useful patetn when you have a small(ish) number of objects that might be 
10InBlock.gif * needed a very large number of times - with slightly differnt informaiton,
11InBlock.gif * that can be externalised outside those objects. 
12ExpandedBlockEnd.gif */

13 None.gif 
14 None.gif namespace  Flyweight_DesignPattern
15 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
16InBlock.gif    using System;
17InBlock.gif    using System.Collections;
18InBlock.gif
19InBlock.gif    class FlyweightFactory 
20ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
21InBlock.gif        private ArrayList pool = new ArrayList();
22InBlock.gif
23InBlock.gif        // the flyweightfactory can crete all entries in the pool at startup 
24InBlock.gif        // (if the pool is small, and it is likely all will be used), or as 
25InBlock.gif        // needed, if the pool si large and it is likely some will never be used
26InBlock.gif        public FlyweightFactory()
27ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
28InBlock.gif            pool.Add(new ConcreteEvenFlyweight());        
29InBlock.gif            pool.Add(new ConcreteUnevenFlyweight());            
30ExpandedSubBlockEnd.gif        }

31InBlock.gif
32InBlock.gif        public Flyweight GetFlyweight(int key)
33ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
34InBlock.gif            // here we would determine if the flyweight identified by key 
35InBlock.gif            // exists, and if so return it. If not, we would create it. 
36InBlock.gif            // As in this demo we have implementation all the possible 
37InBlock.gif            // flyweights we wish to use, we retrun the suitable one. 
38InBlock.gif            int i = key % 2;
39InBlock.gif            return((Flyweight)pool[i]); 
40ExpandedSubBlockEnd.gif        }

41ExpandedSubBlockEnd.gif    }

42InBlock.gif
43InBlock.gif    abstract class Flyweight 
44ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
45InBlock.gif        abstract public void DoOperation(int extrinsicState);        
46ExpandedSubBlockEnd.gif    }

47InBlock.gif
48InBlock.gif    class UnsharedConcreteFlyweight : Flyweight
49ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
50InBlock.gif        override public void DoOperation(int extrinsicState)
51ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
52InBlock.gif            
53ExpandedSubBlockEnd.gif        }

54ExpandedSubBlockEnd.gif    }

55InBlock.gif
56InBlock.gif    class ConcreteEvenFlyweight : Flyweight
57ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
58InBlock.gif        override public void DoOperation(int extrinsicState)
59ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
60InBlock.gif            Console.WriteLine("In ConcreteEvenFlyweight.DoOperation: {0}", extrinsicState);                        
61ExpandedSubBlockEnd.gif        }

62ExpandedSubBlockEnd.gif    }

63InBlock.gif
64InBlock.gif    class ConcreteUnevenFlyweight : Flyweight
65ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
66InBlock.gif        override public void DoOperation(int extrinsicState)
67ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
68InBlock.gif            Console.WriteLine("In ConcreteUnevenFlyweight.DoOperation: {0}", extrinsicState);            
69ExpandedSubBlockEnd.gif        }
    
70ExpandedSubBlockEnd.gif    }

71InBlock.gif
72ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
73InBlock.gif    ///    Summary description for Client.
74ExpandedSubBlockEnd.gif    /// </summary>

75InBlock.gif    public class Client
76ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
77InBlock.gif        public static int Main(string[] args)
78ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
79ExpandedSubBlockStart.gifContractedSubBlock.gif            int[] data = dot.gif{1,2,3,4,5,6,7,8};
80InBlock.gif            
81InBlock.gif            FlyweightFactory f = new FlyweightFactory();
82InBlock.gif            
83InBlock.gif            int extrinsicState = 3;
84InBlock.gif            foreach (int i in data)
85ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
86InBlock.gif                Flyweight flyweight = f.GetFlyweight(i);
87InBlock.gif                  flyweight.DoOperation(extrinsicState);
88ExpandedSubBlockEnd.gif            }

89InBlock.gif            
90InBlock.gif            return 0;
91ExpandedSubBlockEnd.gif        }

92ExpandedSubBlockEnd.gif    }

93ExpandedBlockEnd.gif}

94 None.gif
95 None.gif

转载于:https://www.cnblogs.com/DarkAngel/archive/2005/07/08/188309.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值