简介
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,当每次都新创建一个对象的代价比较大时,可以采用这种模式,它用于创建当前对象的克隆。
优点
- 提高性能;
- 向客户隐藏了创建新实例的复杂性;
- 逃避构造函数的约束;
缺点
- 每个类必须配备一个克隆方法
- 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
使用场景
- 资源优化场景:类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
- 性能和安全要求的场景:通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
- 一个对象多个修改者的场景:一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
实现
cs
/// <summary>
/// 原型模式
/// </summary>
public class Prototype
{
/// <summary>
/// 可以把需要处理的逻辑放在构造函数中
/// </summary>
private Prototype()
{
}
/// <summary>
/// 静态字段也是由CLR保障的,在程序第一次使用该类型之前,完成初始化,且只初始化一次
/// </summary>
private static Prototype _instance = new Prototype();
/// <summary>
/// 每次都返回_instance的克隆对象
/// 内存拷贝,效率很高
/// </summary>
/// <returns></returns>
public static Prototype GetInstance()
{
return (Prototype)_instance.MemberwiseClone();
}
}
总结
Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。
而Prototype则是通过原型(一个特殊的工厂类)来克隆"易变对象"。(其实原型就是一个特殊的单例)。