您的位置:首页 > 其它

Patterns in SOME –Flyweight

2007-03-01 14:49 441 查看
Code in C#:
[align=left] [/align]
[align=left]namespace Flyweight_DesignPattern[/align]
[align=left]{[/align]
[align=left] using System;[/align]
[align=left] using System.Collections;[/align]
[align=left] [/align]
[align=left] class FlyweightFactory [/align]
[align=left] {[/align]
[align=left] private ArrayList pool = new ArrayList();[/align]
[align=left] [/align]
[align=left] // the flyweightfactory can crete all entries in the pool at startup [/align]
[align=left] // (if the pool is small, and it is likely all will be used), or as [/align]
[align=left] // needed, if the pool si large and it is likely some will never be used[/align]
[align=left] public FlyweightFactory()[/align]
[align=left] {[/align]
[align=left] pool.Add(new ConcreteEvenFlyweight()); [/align]
[align=left] pool.Add(new ConcreteUnevenFlyweight()); [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public Flyweight GetFlyweight(int key)[/align]
[align=left] {[/align]
[align=left] // here we would determine if the flyweight identified by key [/align]
[align=left] // exists, and if so return it. If not, we would create it. [/align]
[align=left] // As in this demo we have implementation all the possible [/align]
[align=left] // flyweights we wish to use, we retrun the suitable one. [/align]
[align=left] int i = key % 2;[/align]
[align=left] return((Flyweight)pool[i]); [/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] abstract class Flyweight [/align]
[align=left] {[/align]
[align=left] abstract public void DoOperation(int extrinsicState); [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] class UnsharedConcreteFlyweight : Flyweight[/align]
[align=left] {[/align]
[align=left] override public void DoOperation(int extrinsicState)[/align]
[align=left] {[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] class ConcreteEvenFlyweight : Flyweight[/align]
[align=left] {[/align]
[align=left] override public void DoOperation(int extrinsicState)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine("In ConcreteEvenFlyweight.DoOperation: {0}", extrinsicState); [/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] class ConcreteUnevenFlyweight : Flyweight[/align]
[align=left] {[/align]
[align=left] override public void DoOperation(int extrinsicState)[/align]
[align=left] {[/align]
[align=left] Console.WriteLine("In ConcreteUnevenFlyweight.DoOperation: {0}", extrinsicState); [/align]
[align=left] } [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] ///<summary>[/align]
[align=left] /// Summary description for Client.[/align]
[align=left] ///</summary>[/align]
[align=left] public class Client[/align]
[align=left] {[/align]
[align=left] public static int Main(string[] args)[/align]
[align=left] {[/align]
[align=left] int[] data = {1,2,3,4,5,6,7,8};[/align]
[align=left] [/align]
[align=left] FlyweightFactory f = new FlyweightFactory();[/align]
[align=left] [/align]
[align=left] int extrinsicState = 3;[/align]
[align=left] foreach (int i in data)[/align]
[align=left] {[/align]
[align=left] Flyweight flyweight = f.GetFlyweight(i);[/align]
[align=left] flyweight.DoOperation(extrinsicState);[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] return 0;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]Code in SOME:[/align]

CFlyweightFactory -> AFlyweight[][_pool]
()
AFlyweight GetFlyweight(int)

AFlyweight
a_DoOperation(int)

CUnsharedConcreteFlyweight : AFlyweight
o_DoOperation(int)

CConcreteEvenFlyweight : AFlyweight
o_DoOperation(int)

CConcreteUnevenFlyweight : AFlyweight
o_DoOperation(int)

CClient
main

CClient.main
{
<% int[] data = {1,2,3,4,5,6,7,8}; %>

CFlyweightFactory f.()
{
CConcreteEvenFlyweight f1.();
CConcreteUnevenFlyweight f2.();

_pool.Add(f1);
_pool.Add(f2);
};

<% int extrinsicState = 3; %>
<% foreach (int key in data) %>
<% { %>
int key;
AFlyweight flyweight = f.GetFlyweight(key)
{
<% int i = key % 2; %>
<% return((AFlyweight)_pool[i]); %>
};
flyweight.DoOperation(extrinsicState);
<% }%>
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: