zoukankan      html  css  js  c++  java
  • 通俗易懂设计模式解析——原型模式

    前言

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

    原型模式介绍

    一、来由

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

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

    二、意图

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

    三、案例图

     

    四、原型模式代码示例

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

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

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

     

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

     

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

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

    二、优点

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

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

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

    三、缺点

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

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

    总结

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

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

        C#设计模式系列目录

    欢迎大家扫描下方二维码,和我一起踏上设计模式的闯关之路吧!

      

  • 相关阅读:
    集合容器概述
    enum枚举类型
    this关键字、this()、super()
    重载与重写
    nginx报404的可能错误
    nginx常用命令
    vbs系统监控
    VBS windows监控
    Oracle SQL优化[转]
    shell /bin/bash^M: bad interpreter错误解决
  • 原文地址:https://www.cnblogs.com/hulizhong/p/11434123.html
Copyright © 2011-2022 走看看