zoukankan      html  css  js  c++  java
  • 原型(Prototype)模式

    一、 原型(Prototype)模式

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

    从孙大圣的手段谈起

      孙悟空在与黄风怪的战斗中,"使一个身外身的手段:把毫毛揪下一把,用口嚼得粉碎,望上一喷,叫声'变',变有百十个行者,都是一样得打扮,各执一根铁棒,把那怪围在空中。"换而言之,孙悟空可以根据自己的形象,复制出很多"身外身"来。

    老孙这种身外身的手段在面向对象设计领域里叫原型(Prototype)模式。

    C#对原型模式的支持

      在C#里面,我们可以很容易的通过Clone()-克隆-方法实现原型模式。

    二、 Prototype模式的结构:

      客户(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.ReadLine();
            }
        } 
    
     //Prototype 抽象 原型
        public abstract class Prototype
        {
            private string id;
            // 构造函数
            public Prototype(string id)
            {
                this.id = id;
            }
            public string Id
            {
                get { return id; }
            }
            // 方法
            public abstract Prototype Clone(); 
        }
    
        //具体原型 1
        public class ConcretePrototype1 : Prototype
        {
            // 构造函数 base(id) 实现基类构造函数
            public ConcretePrototype1(string id) : base(id) { }
            // 方法
            public override Prototype Clone()
            {
                // 浅拷贝
                return (Prototype)this.MemberwiseClone();
            }
        }
    
        // 具体原型 2
        public class ConcretePrototype2 : Prototype
        {
            // 构造函数
            public ConcretePrototype2(string id) : base(id) { }
            // 方法
            public override Prototype Clone()
            {
                // 浅拷贝
                return (Prototype)this.MemberwiseClone();
            }
        }

    、 带Prototype Manager的原型模式

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

     

        class Program
        {
            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 color1 = (Color)colormanager[colorName].Clone();
                color1.Display();
    
                colorName = "peace";
                Color color2 = (Color)colormanager[colorName].Clone();
                color2.Display();
    
                colorName = "flame";
                Color color3 = (Color)colormanager[colorName].Clone();
                color3.Display();
    
                Console.ReadLine();
            }
    
        } 
       
    
        /// <summary>
        /// 原型管理器 ColorManager
        /// </summary>
        public class ColorManager
        {
            Hashtable colors = new Hashtable();
    
            // 索引器
            public ColorPrototype this[string name]
            {
                get { return (ColorPrototype)colors[name]; }
                set { colors.Add(name, value); }
            }
    
        }
    
        /// <summary>
        /// 颜色 抽象原型 --> ColorPrototype
        /// </summary>
        public abstract class ColorPrototype
        {
            //方法
            public abstract ColorPrototype Clone();
        }
    
        /// <summary>
        /// 具体原型 Color
        /// </summary>
        public class Color : ColorPrototype
        {
            private int red;
            private int green;
            private int 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);
            }
        }

     

  • 相关阅读:
    CentOS6设置密码过期时间
    scp
    windows查看进程
    mysql5.7密码问题
    mysql主从切换摘要
    mysql慢日志管理
    Linux学习(一)
    Linux学习(一)
    数据结构与算法(1)-算法时间复杂度
    数据结构与算法(1)-算法时间复杂度
  • 原文地址:https://www.cnblogs.com/dragon-L/p/3688071.html
Copyright © 2011-2022 走看看