原型模式

回到首页

概述

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

浅复制

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

深复制

深复制则可以吧引用对象的变量指向复制过的新对象,而不是原有的被引用的对象

结构图

代码实现

原型类

    /// <summary>
    /// 抽象原型类
    /// </summary>
    public 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();
    }
    /// <summary>
    /// 具体原型类1
    /// </summary>
   public class ConcretePrototype1 : Prototype
    {
        // Constructor 
        public ConcretePrototype1(string id)
            : base(id)
        {
        }
        public override Prototype Clone()
        {
            // Shallow copy 
            return (Prototype)this.MemberwiseClone();
        }
    }
    /// <summary>
    /// 具体原型类2
    /// </summary>
    public class ConcretePrototype2 : Prototype
    {
        // Constructor 
        public ConcretePrototype2(string id)
            : base(id)
        {
        }
        public override Prototype Clone()
        {
            // Shallow copy 
            return (Prototype)this.MemberwiseClone();
        }
    }

客户端

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

            // Wait for user 
            Console.Read();
        }
    }

优势

使用原型模式创建对象比直接new一个对象在性能上要好很多

使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用

使用场景

1、资源优化场景。

2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。

3、性能和安全要求的场景。

4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。

5、一个对象多个修改者的场景。

6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。

劣势

配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候

需要为每一个类都配置一个 clone 方法

Demo

posted @ 2021-11-24 23:12  .NET_CJL  阅读(6)  评论(0编辑  收藏  举报