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

前言

  前面几章咱们介绍了建立型设计模式的部份内容,今天我要说的是建立型设计模式中最后一个——原型模式,原型模式是建立型模式中的一种较为特殊的模式,有个最大的特色是克隆一个现有的对象,在咱们平常软件系统开发中,某些对象的建立new即为复杂,并且咱们须要使用多个相同的实例,这样若是咱们依旧使用new去进行建立。就会增长系统的复杂度和增长代码之间的耦合度。可是咱们使用前面介绍的工厂模式的话,随着产品类型的增多,子类也会随之增多。维护代码的难度也就会愈来愈大,因此这里暂时不适合使用工厂模式。因为实例都是同样的,类型相同。可是实例的参数和状态可能不一样。这里有一个对象,而后再结合咱们今天要讲述的原型模式。能够经过一个原型对象,克隆拷贝出许多其余相同的对象来。html

原型模式介绍

1、来由

  在面对软件系统设计的过程当中,会面临着”复杂对象”的建立,然而对象可能会因为需求的变更而进行变更。那么咱们又须要保持接口的稳定性。这时如何保证应对这种变化呢?设计模式

  建立型模式通常是用来建立一个新的对象,而后咱们使用这个对象完成一些对象的操做,咱们经过原型模式能够快速的建立一个对象而不须要提供专门的new()操做就能够快速完成对象的建立,这无疑是一种很是有效的方式,快速的建立一个新的对象。ide

2、意图

    使用原型实例指定建立对象的种类,而后经过拷贝这些原型来建立新的对象。学习

3、案例图

 

 

 

4、原型模式代码示例

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

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

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

 

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

 

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
}

 

   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类的初始化的数量以减小资源消耗code

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

2、优势

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

二、原型类容许动态的增长或减小产品类

三、产品类不须要先肯定产品的等级结构,原型模式适用于任何等级结构

3、缺点

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

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

总结

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

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

    C#设计模式系列目录

欢迎你们扫描下方二维码,和我一块儿踏上设计模式的闯关之路吧!

  

相关文章
相关标签/搜索