通俗易懂设计模式解析——原型模式

2019-09-11 14:59:00 浏览数 (2)

前言

  前面几章我们介绍了创建型设计模式的部分内容,今天我要说的是创建型设计模式中最后一个——原型模式,原型模式是创建型模式中的一种较为特殊的模式,有个最大的特点是克隆一个现有的对象,在我们日常软件系统开发中,某些对象的创建new即为复杂,而且我们需要使用多个相同的实例,这样如果我们依旧使用new去进行创建。就会增加系统的复杂度和增加代码之间的耦合度。但是我们使用前面介绍的工厂模式的话,随着产品类型的增多,子类也会随之增多。维护代码的难度也就会越来越大,所以这里暂时不适合使用工厂模式。由于实例都是一样的,类型相同。但是实例的参数和状态可能不同。这里有一个对象,然后再结合我们今天要讲述的原型模式。可以通过一个原型对象,克隆拷贝出许多其他相同的对象来。

原型模式介绍

一、来由

  在面对软件系统设计的过程中,会面临着”复杂对象”的创建,然而对象可能会由于需求的变动而进行变动。那么我们又需要保持接口的稳定性。这时如何保证应对这种变化呢?

  创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。

二、意图

使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

三、案例图

四、原型模式代码示例

  在原型模式中包含的组成部分较少:

    抽象原型类:原型类,声明一需要实现的接口及clone自身的方法

    具体原型类:实现其余接口及clone自身的方法

  我们来看这么一个示例,我记得小时候上课的时候有时候就想着出去玩,就望着窗户发呆。又出不去。就想自己可以分身就好了。就可以一个留在教室学习,一个出去玩耍,学习可以一次性学习多门功课,玩耍可以一次玩多个游戏。这样就什么都没有耽误,多好呀。当然也只是想想,实现这个暂时是不可能的了。虽然说现实中没办法实现了。刚好今天讲原型模式,就借用这个示例来讲解原型模式到底是如何使用的吧:

代码语言:javascript复制
namespace Prototype_Pattern
{
    class PrototypePattern
    {
    }
    #region 抽象原型类===========
    public abstract class Prototype 
    {
        /// <summary>
        /// 当前自己的状态
        /// </summary>
        public abstract void Status();
        /// <summary>
        /// 当前自己在做的事情
        /// </summary>
        public abstract void Action(string things);
        /// <summary>
        /// 拷贝自身的方法
        /// </summary>
        /// <returns></returns>
        public abstract Prototype Clone();
    }
    #endregion

    #region  具体原型类——读书学习 =============
    public class LearnPrototype : Prototype
    {
        public override void Status()
        {
           Console.WriteLine("当前状态:好好学习"); 
        }

        public override void Action(string things)
        {
            Console.WriteLine(things);
        }

        public override Prototype Clone()
        {
            return (LearnPrototype)this.MemberwiseClone(); 
        } 
       
    }
    #endregion

    #region  具体原型类——外出玩耍 =============
    public class PlayPrototype : Prototype
    { 
        public override void Status()
        {
            Console.WriteLine("当前状态:开心玩耍");
        }

        public override void Action(string things)
        {
            Console.WriteLine( things);
        }

        public override Prototype Clone()
        {
            return (PlayPrototype)this.MemberwiseClone();
        }
    }
    #endregion
}
代码语言:javascript复制
   class Program
    {
        static void Main(string[] args)
        {
            //学习
            Prototype learnPrototype = new LearnPrototype();
            learnPrototype.Status();
            learnPrototype.Action("一号在学习:语文");

            Prototype learnPrototype1 = learnPrototype.Clone();
            learnPrototype.Status();
            learnPrototype.Action("二号在学习:数学");

            //玩耍
            Prototype playPrototype = new PlayPrototype();
            playPrototype.Status();
            playPrototype.Action("一号在玩耍:游戏王");

            Prototype playPrototype1 = playPrototype.Clone();
            learnPrototype.Status();
            learnPrototype.Action("二号在玩耍:四驱赛车");

        }
    }

使用场景及优缺点

一、使用场景

1、在处于资源优化的时候,减少new类的初始化的数量以减少资源消耗

2、一个对象多个利用修改,将一个对象提供给多个调用者使用。

二、优点

1、原型模式向客户端隐藏了创建对象的复杂性,提供Clone进行浅拷贝

2、原型类允许动态的增加或减少产品类

3、产品类不需要先确定产品的等级结构,原型模式适用于任何等级结构

三、缺点

1、每一个类都需要配备一个克隆方法

2、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

总结

  到这里创建型的五个设计模式我们就暂时的介绍完毕了。 在学习设计模式的时候需要多思考,多斟酌。最好在重构之时考虑加入设计模式。保证设计模式发挥最大的用处。到这里创建型模式讲完了。单例模式关注的是对象实例个数的问题。控制对象仅有一个实例,全局访问调用。工厂模式和抽象工厂模式解决的是”单个对象”及”一系列对象”的问题。而建造者模式关注解决的是”对象部分”的问题。今天讲的原型模式可以算的上一个特殊的工厂模式。原型模式一般极少单独使用,一般是配合工厂模式一起使用的。接下来的时间中给大家带来的是结构型的设计模式解析

平凡人生要用平凡的心去对待,你的人生将会更精彩。

0 人点赞