【设计模式】——原型模式

【原型模式】

原型模式是用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

 

【介绍】

  • 主要解决:在运行期建立和删除原型

  • 何时使用:1、当一个系统应该独立于它的产品创建,构成和表示时;2、当要实例化的类是在运行时刻指定时,例如,通过动态装载;3、为了避免创建一个于产品类层次平行的工厂类层次时;4、当一个类的实例只有被几个不同状态组合中的一种时,建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些

  • 如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例

  • 优点:性能高、逃避构造函数的约束

  • 缺点:1、配备克隆方法需要对类的功能进行通盘考虑,对于全新类不是很难,但是对于已有的类不一定容易;2、必须实现Cloneable接口

  • 注意事项:与通过一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象的生成一个新的对象。浅拷贝实现cloneable,深拷贝是通过实现serializable读取二进制流。

 

【实现】

 

步骤一:原型类


 

abstract class Prototype

    {

        private string id;



        // Constructor

        public Prototype(string id)

        {

            this.id = id;

        }



        // Property

        public string Id

        {

            get { return id; }

        }



        public abstract Prototype Clone();

    }

步骤二:具体原型类

class ConcretePrototype1 : Prototype

    {

        // Constructor

        public ConcretePrototype1(string id)

            : base(id)

        {

        }



        public override Prototype Clone()

        {

            // Shallow copy

            return (Prototype)this.MemberwiseClone();

        }

    }





    class ConcretePrototype2 : Prototype

    {

        // Constructor

        public ConcretePrototype2(string id)

            : base(id)

        {

        }



        public override Prototype Clone()

        {

            // Shallow copy

            return (Prototype)this.MemberwiseClone();

        }

    }

 

步骤三:客户端代码


 

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);



            // Wait for user

            Console.Read();

【总结】

 

MemberwiseClone()方法:如果字段是值类型,则该字段执行逐位复制,如果字段是引用类型,则复制引用但不复制引用类型,因此,原始对象及其复本引用同一对象。

 

浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。

深复制:深复制把引用对象的变量指向复制过的新对象,而不是原来的被引用的对象

 

猜你喜欢

转载自blog.csdn.net/damishidai15/article/details/83901049