zoukankan      html  css  js  c++  java
  • 构建者模式

      建造者模式将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象
    角色
    抽象建造者(Builder):给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于程序的商业逻辑。模式中直接创建产品对象的是具体建造者角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法,另一种是结果返回方法
    一般来说产品包含的零件数目与建造方法的数目相符。有多少零件,就应有多少相应的建造方法
    具体建造者:这些是与应用程序紧密相关的一些类,这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例
    导演者角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。
    产品角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不是一定有共同的接口,而完全可以是不相关联的。
     
    导演者角色是与客户打交道的角色,导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。
     
    在什么情况下使用建造者模式:
    1.需要生成的产品对象有复杂的内部结构。每一个内部成分本身可以是对象,也可以仅仅是一个对象的一个组成成分
    2.需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程。因此,如果产品对象 的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式便是一个很好的设计思想。
    3.在对象创建过程 中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。
    同时使用建造者模式主要有以下效果:
    1.建造模式的使用使得产品的内部表象可以独立地变化。使用建造模式可以使客户端不必知道产品内部组成的细节
    2.每一个Builder都相对独立,而与其他的Builder无关
    3.模式所建造的最终产品更易于控制。
    下面是建造两个产品的类图:
    简单的代码示意:
      1 public class BuilderTest {
      2 
      3     /**
      4      * 客户端只需要知道导演者,隐藏了产品创建的细节
      5      */
      6     public static void main(String[] args) {
      7         Director director = new Director();
      8         //构建产品1
      9         director.constructProduct1();
     10         //构建产品2
     11         director.constructProduct2();
     12     }
     13 
     14 }
     15 //抽象构建者
     16 abstract class Builder{
     17     //产品零件建造方法
     18     public abstract void buildPart1();
     19     
     20     public abstract void buildPart2();
     21     //产品返还方法
     22     public abstract Product retriveResult();
     23 }
     24 
     25 //第一个具体构造者
     26 class ConcreteBuilder1 extends Builder{
     27     
     28     private Product1 product = new Product1();
     29     @Override
     30     public void buildPart1() {
     31         System.out.println("构建产品1部件1成功");
     32     }
     33 
     34     @Override
     35     public void buildPart2() {
     36         System.out.println("构建产品1部件2成功");
     37     }
     38 
     39     @Override
     40     public Product retriveResult() {
     41         return product;
     42     }
     43     
     44 }
     45 
     46 //第二个具体构造者
     47 class ConcreteBuilder2 extends Builder{
     48     
     49     private Product2 product = new Product2();
     50     @Override
     51     public void buildPart1() {
     52         System.out.println("构建产品2部件1成功");
     53     }
     54 
     55     @Override
     56     public void buildPart2() {
     57         System.out.println("构建产品2部件2成功");
     58     }
     59 
     60     @Override
     61     public Product retriveResult() {
     62         return product;
     63     }
     64 }
     65 
     66 //标识接口,两个产品类的共同接口
     67 interface Product{}
     68 
     69 //产品类1
     70 class Product1 implements Product{
     71     public Product1(){
     72         
     73     }
     74 }
     75 
     76 //产品类2
     77 class Product2 implements Product{
     78     public Product2(){
     79         
     80     }
     81 }
     82 //导演角色
     83 class Director{
     84     private Builder builder;
     85     
     86     public Director(){
     87         
     88     }
     89     
     90     //产品构造方法,负责调用各个零件建造方法
     91     public Product constructProduct1(){
     92         builder = new ConcreteBuilder1();
     93         builder.buildPart1();
     94         builder.buildPart2();
     95         return builder.retriveResult();
     96     }
     97     public Product constructProduct2(){
     98         builder = new ConcreteBuilder2();
     99         builder.buildPart1();
    100         builder.buildPart2();
    101         return builder.retriveResult();
    102     }
    103 }
  • 相关阅读:
    性能参考指标
    Java Native Interface 二 JNI中对Java基本类型和引用类型的处理
    Java Native Interface 编程系列一
    HTTP的报文与状态码
    [译]Android调整图像大小的一些方法
    Android多线程通信机制
    Android四大组件知识整理
    Java多态与反射
    23种设计模式的优点与缺点概况
    Android应用性能优化
  • 原文地址:https://www.cnblogs.com/wn398/p/3219222.html
Copyright © 2011-2022 走看看