六、原型模式(Prototype)

using System;


/// <summary>
/// 原形模式(ProtoType)
/// 用原形实例指定创建对象的种类,并且通过拷贝这些原形创建新的对象。
/// </summary>
namespace ProtoType_Pattern
{
    //原形模式其实就是就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。


    /// <summary>
    /// 抽象原形类,或 原形接口
    /// 抽象类的关键是有一个Clone()方法
    /// </summary>
    abstract class Prototype
    {
        private string id;
        public Prototype(string id)
        {
            this.id = id;
        }


        public string Id
        {
            get { return id; }
        }


        /// <summary>
        /// 的定义一个抽象类或接口,必须有一个Clone方法
        /// </summary>
        /// <returns></returns>
        public abstract Prototype Clone();
    }


    /// <summary>
    /// 具体原形类
    /// </summary>
    class ConcretePrototype1 : Prototype
    {
        public ConcretePrototype1(string id) : base(id)
        {
        }


        public override Prototype Clone()
        {
            ///创建当前对象的浅表副本。
            ///方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
            ///如果字段是值类型的,则对该字段执行逐位复制。
            ///如果是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其副本引用同一对象。
            return (Prototype)this.MemberwiseClone();


            //由于此方法是浅复制,若类中包含对象的引用就不能简单的使用此方法来实现。
            //这时我们需要用到深复制
           
            
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ConcretePrototype1 p1 = new ConcretePrototype1("我");
            //克隆类ConcretePrototype1的对象p1就能得到新的实例从c1
            ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
            Console.WriteLine("克隆:{0}",c1.Id);
            Console.Read();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/xiangwenfly/article/details/55007058
今日推荐