小明的水果点即将开业,需要做一些宣传和优惠券,这时我们只需要一张优惠券然后通过打印店复制一大堆,下次还需要搞活动的时候直接拿去复印就好了,不需要每一张每一张手动的去重新制作。我们这里可以使用原型模式,他是一种对象创建型设计模式,将一个原型对象传递给要发动创建的对象(客户端对象),这个创建者通过请求原型对象复制自己来创建的过程。
原型模式(Protetype Pattern):使用原型实例指定待创建的类型,并且通过复制这个原型来创建新的对象。
原型模式的结构
Prototype(抽象原型类):他声明克隆方法的接口,是所有具体原型类的公共类
public abstract class ProtoType
{
public abstract ProtoType Clone();
}
ConcretePrototype(具体原型类):它实现抽象类中声明的克隆方法,返回一个自己的克隆对象
public class ConcreteProtypeA : ProtoType
{
private string attr { get; set; }
public override ProtoType Clone()
{
ConcreteProtypeA concrete = new ConcreteProtypeA();
concrete.attr = attr;
return concrete;
}
}
Client(客户端):客户让一个原型对象克隆自身,从而创建一个新的对象
ConcreteProtypeA concrete = new ConcreteProtypeA();
ConcreteProtypeA copy = (ConcreteProtypeA)concrete.Clone();
根据在复制原型对象的同时是否复制在原型对象中的引用类型成员变量,原型模式分为两种:深克隆(Shallow Clone)、浅克隆(Deep Clone)具体请查看C#的深克隆和浅克隆一文
原型模式的优点:
1.扩展性好,增加或减少具体原型对系统没有任何影响
2.原型模式提供了简化的创建结构,常常与工厂方法模式一起使用
3.如果创建对象的实例比较复杂的时候,原型模式可以简化对象的创建过程
4.可以使用深克隆的方式保存对象的状态,在操作过程中可以追溯操作日志,做撤销和回滚操作
原型模式的缺点:
1.需要为每一个类配置一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了开闭原则
2.在做深克隆的时候,如果对象之间存在多重嵌套的引用时,为了实现克隆,对每一层对象对应的类都必须支持深克隆实现起来比较麻烦
原型模式的适用环境:
1.创建成本比较大,比如初始化需要较长时间、占用太多CPU、占用大量网络资源等
2.系统需要保存对象状态
3.避免使用分层创建的对象,并且实例对象只有一个或少数几个组合状态