原型模式通过复制一个原型对象得到多个与原型对象一模一样的新对象,实现原型模式的关键在于如何实现克隆方法。
通用的克隆实现方法是在具体原型类的克隆方法中实例化一个与自身类型相同的对象并将其返回,并将相关的参数传入新创建的对象中,保证它们的成员变量相同。
优点:
1、原型模式向客户隐藏了创建新实例的复杂性。
2、原型模式允许动态增加或较少产品类。
3、原型模式简化了实例的创建结构,工厂方法模式需要有一个与产品类等级结构相同的等级结构,而原型模式不需要这样。
4、产品类不需要事先确定产品的等级结构,因为原型模式适用于任何的等级结构。
缺点:
1、每个类必须配备一个克隆方法。
2、 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对已有的类不一定容易,特别当一个类引用不支持串行化的间接对象,或引用含循环结构的时候。
eg:孙悟空原型,可以变出无数个和他一模一样的孙悟空。
//孙悟空原型
public abstract class MonkeyKingPrototype
{
public string Id { get; set; }
public MonkeyKingPrototype(string id)
{
this.Id = id;
}
// 克隆方法,即孙大圣说“变”
public abstract MonkeyKingPrototype Clone();
}
//创建具体原型
//此方法是原型模式的通用实现
public class ClonePrototype : MonkeyKingPrototype
{
public ClonePrototype(string id) : base(id) { }
//克隆方法
public override MonkeyKingPrototype Clone()
{
// 调用MemberwiseClone方法实现的是浅拷贝,另外还有深拷贝
return (MonkeyKingPrototype)this.MemberwiseClone();
}
}
//调用
// 孙悟空 原型
MonkeyKingPrototype prototypeMonkeyKing = new ClonePrototype("MonkeyKing");
// 变一个
MonkeyKingPrototype cloneMonkeyKing = prototypeMonkeyKing.Clone() as ClonePrototype;
Console.WriteLine("克隆一个:" + cloneMonkeyKing.Id);