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


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

    原型模式类图:

    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 模式的最主要缺点就是每一个类必须配备一个克隆方法。而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,

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

  • 相关阅读:
    请求的详细资料级别没有事实表
    BIEE汇总数据如何放在后面
    Biee仪表盘中提示空值如何去掉
    UFT测试本地应用程序登陆小实例(描述性编程)
    Mysql找回丢失密码
    linux下Mysql多实例实现
    如何从零安装Mysql
    Linux系统下yum源配置(Centos 6)
    Linux系统管理常用命令用法总结(2)
    Linux系统管理常用命令用法总结(1)
  • 原文地址:https://www.cnblogs.com/bro-ma/p/5194661.html
Copyright © 2020-2023  润新知