设计模式之原型模式

Posted xiaoyulong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之原型模式相关的知识,希望对你有一定的参考价值。


原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

 作用(解决的问题):简化对象的创建过程。

 优点:
 1、当创建对象的实例较为复杂的时候,使用原型模式可以简化对象的创建过程,通过复制一个已有的实例可以提高实例的创建效率。
 2、扩展性好,由于原型模式提供了抽象原型类,在客户端针对抽象原型类进行编程,符合开闭原则。
 3、原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构,而原型模式不需要这样,
 原形模式中产品的复制是通过封装在类中的克隆方法实现的,无需专门的工厂类来创建产品。
 4、可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,以便在需要的时候使用(例如恢复到历史某一状态)。

 缺点:
 1、需要为每一个类配置一个克隆方法,而且该克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码。
 2、在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重签到引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。

实现:

/// <summary>
     /// 克隆接口
     /// </summary>
     /// <typeparam name="T"></typeparam>
    public interface Prototype<T>
    {
        T Clone();
    }
    /// <summary>
    /// 实现类
    /// </summary>
    public class ConcretePrototype : Prototype<ConcretePrototype>
    {
        public ConcretePrototype Clone()
        {
            return (ConcretePrototype)this.MemberwiseClone();
        }
    }

 

原型模式说白了就是克隆,不用想的太复杂,定义一个克隆接口,然后去实现就可以了。我们唯独需要注意的是深度复制和浅度复制的问题。

浅度复制:值类型复制一份数据出来,引用类型只会复制地址,也就是说浅度复制后,母体和克隆体里面的引用类型数据会指向同一个实体。

深度复制:值类型复制一份数据出来,引用类型会生成一个新的实体,和母体的数据保持一致。虽然母体和克隆体引用类型数据是一样的,但是是两个不同的实体。















以上是关于设计模式之原型模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之原型模式

设计模式之原型

设计模式之原型模式

PHP设计模式之工厂模式和原型模式

一天学习一个设计模式之原型模式

go设计模式之原型模式