设计模式之原型模式

一、原型模式:在某一个实例的基础上克隆出一个一模一样的另一个实例。

二、实现思路 :调用.MemberwiseClone()方法可返回一新的克隆实例。

三、代码举例:   

1、Human类:

namespace Prototype
{
    public class Human
    {
        private static Human _Human = null;
        private Human()//私有化构造函数防止外部new对象
        {
        }
        static Human()//静态构造函数:由clr调用并保证在第一次使用这个类之前,调用且只调用一次(确保该类永远只被初始化一次)
        {
            _Human = new Human();
            Console.WriteLine("Human被第一次被构造......");
        }
        public static Human CreateInstance()
        {
            Human prototype = (Human)_Human.MemberwiseClone();//在_Human实例的基础上克隆一个对象,还可以使用序列化和反序列化实现深克隆
            Console.WriteLine("_Human被克隆......");
            return prototype;
        } 
    }
}

 2、客户类:

  {
      //原型模式:
     Prototype.Human human1 = Prototype.Human.CreateInstance();
     Prototype.Human human2 = Prototype.Human.CreateInstance();
     Console.WriteLine("human1与human2是否为同一对象?{0}", object.ReferenceEquals(human1, human2));//运行证明,这里的两个实例不是同一个实例,他们都是被克隆的副本
     singletonOne obj1 = Singleton.singletonOne.CreateInstance();
     singletonOne obj2 = Singleton.singletonOne.CreateInstance();
     Console.WriteLine("obj1与obj2是否为同一对象?{0}", object.ReferenceEquals(obj1, obj2));//与原型模式相比,单例模式返回的实例是同一个实例,操作其中一个会影响另一个
     Console.WriteLine(".............................");
     Console.ReadKey();
            }

3、 运行结果:

四、原型模式的优缺点及应用:它适用快速复制一个实例(克隆比创建速度快),但是在使用过程中要注意:使用MemberwiseClone()克隆是浅克隆模式,操作其中一个实例不会影响另一个实例(但是:如实例中包含引用类型的变量,则该变量克隆时同样指向同一地址,操作引用类型时,也会影响另一个实例),另外还有一种实现深克隆的方式,使用序列化和反序列化方式,将原实例序列化,然后再反序列化会产生一个新的实例,该实例中的引用也是不同的地址,两个实例之间除了长得像之外,没任何联系。

posted @ 2022-07-21 00:52  我若安好,便是晴天  阅读(33)  评论(0)    收藏  举报