设计模式之原型模式
一、原型模式:在某一个实例的基础上克隆出一个一模一样的另一个实例。
二、实现思路 :调用.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()克隆是浅克隆模式,操作其中一个实例不会影响另一个实例(但是:如实例中包含引用类型的变量,则该变量克隆时同样指向同一地址,操作引用类型时,也会影响另一个实例),另外还有一种实现深克隆的方式,使用序列化和反序列化方式,将原实例序列化,然后再反序列化会产生一个新的实例,该实例中的引用也是不同的地址,两个实例之间除了长得像之外,没任何联系。

浙公网安备 33010602011771号