首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计方式之创建模式之建造模式及原始模式模式

2012-12-25 
设计模式之创建模式之建造模式及原始模式模式一、建造模式(Builder)1,UML图抽象建造者(Builder)角色:给出一

设计模式之创建模式之建造模式及原始模式模式
一、建造模式(Builder)
1,UML图
      


    抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建
造方法,比如本例子中的buildPart1()和buildPart2();另一种是结果返还方法,即本例
子中的retrieveResult().一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少零件,就有多少相应的建造方法。
    具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应该程序调用下创建产品的实例。这个角色要完成的任务包括:
    (1)实现抽象建造都(Builder)所声明的接口,给出一步一步地完成创建产品实例的操作。
    (2)在建造过程完成后,提供产品的实例。
    导演者(Director)角色:担任这个角色的类调用具体建造角色以创建产品对象。应当指出的是,导演者角色并没有产吕类的具体的知识,真正拥有产品类的具体知识的是具体建造角色。
    产品(Product)角色:产品(Product)便是建造中复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。
2, 模式说明
  
    一个产品常有不同的组成成分作为产品的零件,这些零件可能是对象,也有可能不是对象,它们通常又叫做产品的内部表象(internal representation)。不同的产品可以有不同的内部表象,也就是不同的零件。使用建造模式使客户端不需要知道所生成的产品对象有哪些零
件,每个产品的对应零件彼此有何不同,是怎么建造出来的,以及怎样组成产品。
3,模式示例代码
  

       package com.maohao.build.build;       public class Director {   Builder builder;   public void buildProduct() {builder = new MyBuilder();builder.buildPart1();builder.buildPart2();Product product = builder.retriveResult();    }        }    


4,与其他模式比较
     
    与抽象工厂:都是创建模式,在抽象工厂模式中,每次工厂对象被调用时都会返还一个完整的产品对象。而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会。
    建造类不同,它一点一点地建造出一个复杂的产品,而这个产品的组装过程就发生在建造者角色内部。建造者模式的客户拿到的是一个完整的最后产品。换言这,抽象工厂模式处在更加具
    体的尺度上,而建造模式则处于更加宏观的尺度上。一个系统可以由一个建造模式和一个抽象工厂模式组成,客户端通过调用这个建造角色,间接地调用另一个抽象工厂模式的工厂角色。
    工厂模式返还不同产品族的零件,而建造者模式则把它们组装起来。

    策略模式:建造模式在结构上很接近于策略模式,事实上建造模式是策略模式的一种特殊情况,这两种械的区别在于它们的用意不同。建造模式适用于为客户端一点一点地建造新的对象,而不同类型的具体建造者角色虽然拥有相同的接口,但是它们所创建出来的对象则可能完全不同。

    模板方法模式:建造模式在退化、失去导演者角色后,可以顺理成单地发展到模板方法模式。

    合成模式:正如前面说的,产品的零件可以是对象,也可以不是对象,而是对象的某种组成成分。当产品的零件确实是对象时,产品对象就变成了复合对象,因为产品内部还含有子对象。
    这种对象内含有子对象的结构,可以使用合成模式描述。换言之,合成模式描述一个对象树的组成结构,而建造模式则可以用来描述对象树的生成过程。

5,模式应用
   
   JavaMail中的Message和MimeMessage等  

二、原始模型(Prototype)模式
1,UML图

    客户(Client)角色:客户类提出创建对象的请求;
    抽象原型(Prototype)角色:这是一个抽象角色,通常由一个Java接口或Java抽象类实现。此角色给出所有的具体原型类所需的接口;
    具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
2, 模式说明
  
    原始模型属于对象的创建模式,通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类的对象。这就是原始模型的用意。
3,模式示例代码
    略了,见http://jminglee.iteye.com/blog/1315153

4,模式优缺点

   优点:(1)原始模型模式允许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此,增加新产品对整个结构没有影响。
         (2)原始模型模式提供简化的创建结构。工厂方法模式常常需要一个与产品类等级结构相同的等级结构,而原始模型模式就不需要这样。对于Java设计师来说,原始模式又有其特有的方便之处,因为Java语言天生就将原始模型模式设计到了语言模型里面。善于利用原始模型模式和Java语言的特点,可以事半而功倍。
         (3)具有给一个应用软件动态加载新功能的能力。例如,一个分析Web服务器的记录文件的应用软件,针对每一种记录文件格式,都可以由一个相应的“格式类”负责。如果出现了应用软件不支持的新的Web服务器,只需要提供一个格式类的克隆,并在客户端登记即可,而不必给每个软件的用户提供一个全新的软件包。
         (4)产品类不需要非得有任何事先确定的等级结构,因为原始模型模式适于任何的等级结构。
    缺点:每一个类都必须配备一个克隆方法。配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类来说不是很难,而对于已经有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

5,与其他模式比较
     
    与抽象工厂:如系统不需要动态地改变原型对象,抽象工厂模式可以成为原始模型模式的替代品。

    工厂方法:如果原型对象只有一种,而且不会增加的话,工厂方法模式可以成为一种替代模式。

    原始模型模式:常常与原始模型模式一起使用。


6,模式应用
   
   Java语言自带了clone()方法,其中关于Java语言的深浅clone建议大家看下这篇blog:
                                        http://jminglee.iteye.com/blog/1315153
     

热点排行