返回首页


你可以看到这一点,对设计模式的其他伟大的文章NBSP。
{A1}允许您在应用程序中重用的内存空间,当你有大量的对象,几乎在本质上是一致的。例如,如果您正在编写一个智能手机的内存量是非常有限的的一个游戏,你需要显示,在外形上完全一样的许多外国人,可以只有一个地方保存,而不是外来的形状保持每个相同的形状,在珍贵的记忆。
{A2},有内在和外在状态的概念。内在各国的事情是不变的,并存储在内存中。外在的国家是不是恒定的,并在飞行需要计算的东西,因此不能存储在内存中。
例如,在游戏中,我们想创建,外星人的形状都是一样的,但它们的颜色会改变如何狂每个基础。外星人的形状,将内在的,外来的颜色,将外在的。
让我们来看看:FlyweightFactory类只是一个索引,可以检索的轻量级的对象,当给定的索引号,因为你可能有许多轻量级的对象,在您的application.nbsp;IFlyweight接口定义的轻量级的对象所需的方法和属性。 GetExtrinsicState方法得到的外在状态和intrinsicState变量持有内在states.nbsp;ConcreteFlyweight类是实际的轻量级的对象。 intrinsicState变量存储的信息是不变的,而GetExtrinsicState方法计算动态的外在状态。
应用:
{A6}AlienFactory类存储和检索不同类型的外国人使用其GetAlien SaveAlien methods.nbsp; IAlien接口定义为国家的内在和外在状态的getColor方法的形状属性。LargeAlien和LittleAlien类是轻量级的对象,其中每个都有它自己的形状的内在状态和计算GetColor外在状态方法。
一个比较的{A2}和的是使用到创建的性质类似的(因此,一个创建模式)的新对象,而{A2的是使用,应用程序,以点相同的实例对象以节省内存(因此它的结构模式)

下面是实现代码,例如使用{A}的输出。注意内在状态存储在一个地方,只为了节省内存而外在国飞计算:

public enum Color { Green, Red, Blue }



class Program

{

    static void Main(string[] args)

    {

        //create Aliens and store in factory

        AlienFactory factory = new AlienFactory();

        factory.SaveAlien(0, new LargeAlien());

        factory.SaveAlien(1, new LittleAlien());



        //now access the flyweight objects

        IAlien a = factory.GetAlien(0);

        IAlien b = factory.GetAlien(1);



        //show intrinsic states, all accessed in memory without calculations

        Console.WriteLine("Showing intrinsic states...");

        Console.WriteLine("Alien of type 0 is " + a.Shape);

        Console.WriteLine("Alien of type 1 is " + b.Shape);



        //show extrinsic states, need calculations

        Console.WriteLine("Showing extrinsic states...");

        Console.WriteLine("Alien of type 0 is " + a.GetColor(0).ToString());

        Console.WriteLine("Alien of type 0 is " + a.GetColor(1).ToString());

        Console.WriteLine("Alien of type 1 is " + b.GetColor(0).ToString());

        Console.WriteLine("Alien of type 1 is " + b.GetColor(1).ToString());

    }

}



public interface IAlien

{

    string Shape { get; }  //intrinsic state



    Color GetColor(int madLevel);  //extrinsic state

}



public class LargeAlien : IAlien

{

    private string shape = "Large Shape";  //intrinsic state



    string IAlien.Shape

    {

        get { return shape; }

    }



    Color IAlien.GetColor(int madLevel)   //extrinsic state

    {

        if (madLevel == 0)

            return Color.Green;

        else if (madLevel == 1)

            return Color.Red;

        else

            return Color.Blue;

    }

}



public class LittleAlien : IAlien

{

    private string shape = "Little Shape";  //intrinsic state



    string IAlien.Shape

    {

        get { return shape; }

    }



    Color IAlien.GetColor(int madLevel)   //extrinsic state

    {

        if (madLevel == 0)

            return Color.Red;

        else if (madLevel == 1)

            return Color.Blue;

        else

            return Color.Green;

    }

}



public class AlienFactory

{

    private Dictionary<int,> list = new Dictionary<int,>();



    public void SaveAlien(int index, IAlien alien)

    {

        list.Add(index, alien);

    }



    public IAlien GetAlien(int index)

    {

        return list[index];

    }

}</int,></int,>

{A9}
喜欢这篇文章吗?你可以看到这和其他设计模式{A10}的大文章。

回答

评论会员:Rhuros 时间:2012/01/27
好的博客
评论会员:alxxl 时间:2012/01/27
这是非常好的文章,很好的解释。你可以找到列表中的设计模式和breaf defination

{A11}