享元模式(Flyweight )

享元模式(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

典型的享元模式的例子为文书处理器中以图形结构来表示字符。一个做法是,每个字形有其字型外观, 字模 metrics, 和其它格式资讯,但这会使每个字符就耗用上千字节。取而代之的是,每个字符参照到一个共享字形物件,此物件会被其它有共同特质的字符所分享;只有每个字符(文件中或页面中)的位置才需要另外储存。

例如:就像中午你去吃饭一样,炒饭制作方法共享的,你可以制作一中午的量,而无需单独制作

 炒饭有内蕴状态,也就是炒饭的风味;炒饭有外在因素,也就是说外蕴状态,例:8号桌点的炒饭

using System;
using System.Collections;

public abstract class Order
{
    // 将炒饭卖给客人
    public abstract void Serve(Table table);
    // 返回炒饭的名字
    public abstract string GetFlavor();
}

public class Flavor : Order
{
    private string flavor;

    // 构造函数,内蕴状态以参数方式传入
    public Flavor(string flavor)
    {
        this.flavor = flavor;
    }

    // 返回炒饭的名字
    public override string GetFlavor()
    {
        return this.flavor;
    }

    // 将炒饭卖给客人
    public override void Serve(Table table)
    {
        Console.WriteLine("Serving table {0} with flavor {1}", table.Number, flavor);
    }
}

public class FlavorFactory
{
    private Hashtable flavors = new Hashtable();

    public Order GetOrder(string key)
    {
        if (!flavors.ContainsKey(key))
            flavors.Add(key, new Flavor(key));

        return ((Order)flavors[key]);
    }

    public int GetTotalFlavorsMade()
    {
        return flavors.Count;
    }
}

public class Table
{
    private int number;

    public Table(int number)
    {
        this.number = number;
    }

    public int Number
    {
        get { return number; }
    }
}

public class Client
{
    private static FlavorFactory flavorFactory;
    private static int ordersMade = 0;

    public static void Main(string[] args)
    {
        flavorFactory = new FlavorFactory();

        TakeOrder("蛋炒饭");
        TakeOrder("回锅炒饭");
        TakeOrder("番茄炒饭");
        TakeOrder("青椒肉丝炒饭");
    

        Console.WriteLine("\nTotal Orders made: " + ordersMade);

        Console.WriteLine("\nTotal Flavor objects made: " +
          flavorFactory.GetTotalFlavorsMade());


        Console.Read();
    }

    private static void TakeOrder(string aFlavor)
    {
        Order o = flavorFactory.GetOrder(aFlavor);

        // 将炒饭卖给客人
        o.Serve(new Table(++ordersMade));
    }
}

 

posted @ 2014-07-10 16:51  欢呼雀跃  阅读(147)  评论(0)    收藏  举报