六、原型模式--创建型模式

原型模式:通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。

原型模式类图:

image

类图说明:
客户(Client)角色:客户类提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个 C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在 C#中,
抽象原型角色通常实现了 ICloneable 接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。

示例代码:

class Program
    {
        static void Main(string[] args)
        {
            ConcreteProtoType1 p1 = new ConcreteProtoType1("I");
            ConcreteProtoType1 c1 = (ConcreteProtoType1)p1.Clone();
            Console.WriteLine("Cloned:{0}", c1.Id);

            ConcreteProtoType2 p2 = new ConcreteProtoType2("II");
            ConcreteProtoType2 c2 = (ConcreteProtoType2)p2.Clone();
            Console.WriteLine("Cloned:{0}", c2.Id);
            Console.ReadKey();
        }
    }

    abstract class ProtoType
    {
        private string id;
        public ProtoType(string id)
        {
            this.id = id;
        }

        public string Id
        {
            get { return id; }
        }

        abstract public ProtoType Clone();
    }

    class ConcreteProtoType1 : ProtoType
    {
        public ConcreteProtoType1(string id)
            : base(id)
        {
        }

        public override ProtoType Clone()
        {
            return (ProtoType)this.MemberwiseClone();
        }
    }

    class ConcreteProtoType2 : ProtoType
    {
        public ConcreteProtoType2(string id)
            : base(id)
        { }

        public override ProtoType Clone()
        {
            return (ProtoType)this.MemberwiseClone();
        }
    }
View Code

运行结果:

 
这个例子实现了一个浅拷贝。其中 MemberwiseClone()方法是 Object类的一个受保护方法, 实现了对象的浅拷贝。
 
带 Prototype Manager的原型模
类图:
 
客户(Client)角色:客户端类向原型管理器提出创建对象的请求。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个 C#接口或抽象类实现。此角色 给出所有的具体原型类所需的接口。在 C#中,抽象原型角色通常实现了 ICloneable 接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要 求的接口。
原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对 象。 
 
示例代码:
 
class PrototypeManager
    {
        static void Main(string[] args)
        {
            ColorManager colorManager = new ColorManager();

            colorManager["red"] = new Color(255, 0, 0);
            colorManager["green"] = new Color(0, 255, 0);
            colorManager["blue"] = new Color(0, 0, 255);

            colorManager["angry"] = new Color(255,54,0);
            colorManager["peace"] = new Color(128,211,128);
            colorManager["flame"] = new Color(211,34,20);

            string colorName = "red";
            Color c1 = (Color)colorManager[colorName].Clone();
            c1.Display();

            colorName = "peace";
            Color c2 = (Color)colorManager[colorName].Clone();
            c2.Display();

            colorName = "flame";
            Color c3 = (Color)colorManager[colorName].Clone();
            c3.Display();

            Console.ReadKey();

        }
    }

    abstract class ColorPrototype
    {
        public abstract ColorPrototype Clone();
    }

    class Color : ColorPrototype
    {
        private int red, green, blue;

        public Color(int red, int green, int blue)
        {
            this.red = red;
            this.green = green;
            this.blue = blue;
        }

        public override ColorPrototype Clone()
        {
            return (ColorPrototype)this.MemberwiseClone();
        }

        public void Display()
        {
            Console.WriteLine("RGB values are :{0},{1},{2}", red, green, blue);
        }
    }

    class ColorManager
    {
        Hashtable colors = new Hashtable();

        public ColorPrototype this[string name]
        {
            get { return (ColorPrototype)colors[name]; }
            set { colors.Add(name, value); }
        }
    }
View Code

运行结果:

Prototype 模式的优点包括
1、Prototype 模式允许动态增加或减少产品类。由于创建产品类实例的方法是产批类内部具有 的,因此增加新产品对整个结构没有影响。 
2、Prototype 模式提供了简化的创建结构。工厂方法模式常常需要有一个与产品类等级结构相 同的等级结构,而 Prototype 模式就不需要这样。
3、Portotype 模式具有给一个应用软件动态加载新功能的能力。由于 Prototype 的独立性较 高,可以很容易动态加载新功能而不影响老系统。 
4、产品类不需要非得有任何事先确定的等级结构, 因为 Prototype 模式适用于任何的等级结构。 
Prototype 模式的缺点:
Prototype 模式的最主要缺点就是每一个类必须配备一个克隆方法。而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,

但对已有的类进行改造时,不一定是件容易的事。

原文地址:https://www.cnblogs.com/bro-ma/p/5194661.html