定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
类型 创建型模式
特点 通过一个对象创建另外一个对象,创建时不需要知道任何创建的细节。
举例 对象复制。

本文以C#为例,先来看类图🔻

设计模式-原型模式.png

原型模式还是比较简单的,实质就是对象自身实现一个Clone方法,如果需要创建新对象,拷贝一份原型对象即可。
模式比较简单,所以直接上代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    /// <summary>
    /// 原型类
    /// </summary>
    abstract class Prototype
    {
        /// <summary>
        /// 标识
        /// </summary>
        public string Flag { get; set; }

        protected Prototype(string flag)
        {
            this.Flag = flag;
        }
        public abstract Prototype Clone();
    }
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    /// <summary>
    /// 具体的原型1
    /// </summary>
    class ConcretePrototype1 : Prototype
    {
        public ConcretePrototype1(string flag) : base(flag)
        {

        }
        public override Prototype Clone()
        {
            //这里只是为了演示原型模式的原理,所以使用简单的浅复制
            return (Prototype)this.MemberwiseClone();
        }
    }

客户端调用代码🔻

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
            //创建一个对象cp1
            var obj1 = new ConcretePrototype1("A");
            //通过原型模式复制一个cp1的副本
            var obj2 = obj1.Clone();

            //展示复制结果
            Console.WriteLine($"原对象标识:{obj1.Flag},新复制对象标识:{obj2.Flag}");
            obj2.Flag = "B";
            Console.WriteLine($"原对象标识:{obj1.Flag},新复制对象标识:{obj2.Flag}");

            //程序输出:
            //原对象标识:A,新复制对象标识:A
            //原对象标识:A,新复制对象标识:B

这里特别需要注意一下,文中演示使用的this.MemberwiseClone()方法,实际上只是实现了对象的浅拷贝。至于如何实现深拷贝,这里不做实现😂😂。

浅拷贝:如果字段是值类型,则对字段进行复制,如果字段是引用类型,则复制引用本身
深拷贝:如果字段是值类型,则对字段进行复制,如果字段是引用类型,则复制一个新对象,而不是原有被引用的对象。

参考资料:
《大话设计模式》