设计模式学习之创建型模式学习总结

来源:互联网 发布:linux调出终端快捷键 编辑:程序博客网 时间:2024/05/22 08:29

    最近在家疯狂充电,学完深入挖掘asp.net2.0的课程之后,就开始了我的《面向对象设计模式纵横谈》课程。之前对设计模式有所了解,所以这次系统去学习和实践也还是蛮有意思的! 至于为什么要学习设计模式,Gof说是应付程序设计中各种各样的需求变化,也有朋友说是为了便于程序员之间的沟通,反正我觉得有了设计模式编程就不会那么单调了。先不管那么多为什么要学了,我总结一下我第一阶段所学(创建型模式)。

    Gof的《设计模式》书中介绍了23中设计模式,依据这23种设计模式的目的划分了三大类:

  • 创建型(Creational)模式:负责对象创建。
  • 结构型模式(Structural):处理类与对象间的组合。
  • 行为型模式(Behavioral):类与对象交互中的职责分配。

    在这一阶段的学习让我我深刻理解了创建型模式中的5大设计模式,下面听我一一来介绍和分析

     1.   Singleton单件模式(入门)

    Gof的描述为:保证一个类仅有一个实例,并且提供一个该类实例的全局访问点。
    在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
    单件模式通过编程语言实现的特征表现为:类和实例的创建合为一体,类包含了创建自身实例的方法,通过定义静态的自身实例对象和静态的方法来返回自身的实例。

      2.   Abstract Factory抽象工厂模式(常见)

    Gof的描述为:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。
    在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。
    抽象工厂类保证了“相互依赖对象”之间的关系,由一系列具体工厂负责具体“一系列相互依赖对象”的创建工作,使用面向对象的技术来“封装”变化点,来避免客户程序和这种“多系列具体对象创建工作”的紧耦合。

     3.   Builder生成器模式

    Gof的描述为:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
    在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
        通过构造器抽象类来保障统一的构造过程,各个构造器类可以有各自不同的表示算法,提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变。

     4.    Factory  Method工厂方法模式

    Gof的描述为:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。
    在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
    抽象工厂类保持了创建“单个变化对象”的稳定接口,由变化的具体工厂子类类来创建具体的“单个变化对象”,提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求改变而改变,较好地解决了这种紧耦合关系。
    Factory Method模式解决“单个对象”的需求变化,Abstract Factory 模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。

     5.    Prototype原型模式

    Gof的描述为:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。
    在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。
    抽象类保持了稳定接口,并且定义了Clone方法其子类都能进行拷贝操作,以创建不同的对象。客户程序调用者和抽象类打交道,然后在任何需要的地方不断地Clone。Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。
    Prototype模式中的Clone方法可以利用.NET中的Object类的MemberwiseClone()方法或者序列化来实现深拷贝。

     6.    总结

  • Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。
  • Factory Method, Abstract Factory, Builder都需要一个额外的工厂类来负责实例化“易变对象”,而rototype则是通过原型(一个特殊的工厂类)来克隆“易变对象”。
  • 如果遇到“易变类”,起初的设计通常从FactoryMethod开始,当遇到更多的复杂变化时,再考虑重构为其他三种工厂模式( Abstract Factory,Builder , Prototype )。

    本次学习过程中的实践代码本人随后将提供下载!