读书笔记_java设计模式深入研究 第四章 生成器模式 (建造者模式) Builder

  1,生成器的模式的意图在于将一个复杂的构建与其标识相互分离,是的同样的构建过程可以创建不同的表示。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成不同的内部表象的产品。

2,生成器模式UML图:
读书笔记_java设计模式深入研究 第四章  生成器模式 (建造者模式) Builder

读书笔记_java设计模式深入研究 第四章  生成器模式 (建造者模式) Builder

-1,建造者IBuilder角色:给出一个抽象接口,以规范产品对象各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。可以在接口中只定义一个总的建造方法,再在子类总实现。这样子可以实现操作的隔离。
-2,具体建造者Builder角色:此角色实现建造者接口,此角色主要完成IBuilder中的各个接口,在各个建造步骤完成后,提供一个组合方法,返回产品实例。
-3,指导者Director角色:此角色调用具体建造者以创建产品对象。
-4,产品Product角色:对应业务产品。
3,具体代码如下:
  1. /**
     
     *
     
     * @(#) IBuilder.java
     
     * @Package pattern.chp04.builder
     
     * 
     
     * Copyright © JING Corporation. All rights reserved.
     
     *
     
     */
     
     
     
    package pattern.chp04.builder;
     
     
     
    /**
     
     *  类描述:建造者接口
     
     * 
     
     *  @author:  Jing
     
     *  @version  $Id: Exp$ 
     
     *
     
     *  History:  Dec 19, 2014 11:11:16 AM   Jing   Created.
     
     *           
     
     */
     
    public interface IBuilder {
     
    /**
     
     * 
     
     * 方法说明:生成产品对象
     
     *
     
     * Author:       Jing                
     
     * Create Date:   Dec 19, 2014 11:11:56 AM
     
     *
     
     * @return
     
     * @return Product
     
     */
     
    public Product create();
     
    }
     
    /**
     
     *
     
     * @(#) BuildProduct.java
     
     * @Package pattern.chp04.builder
     
     * 
     
     * Copyright © JING Corporation. All rights reserved.
     
     *
     
     */
     
     
     
    package pattern.chp04.builder;
     
     
     
    /**
     
     * 类描述:具体产品生成
     
     * 
     
     * @author: Jing
     
     * @version $Id: Exp$
     
     * 
     
     * History: Dec 19, 2014 11:14:37 AM Jing Created.
     
     * 
     
     */
     
    public class BuildProduct implements IBuilder {
     
     
     
    Product model = new Product();
     
     
     
    public Product create() {
     
     
     
    createScreen();
     
    createMainframe();
     
    return model;
     
    }
     
     
     
    /**
     
     * 
     
     * 方法说明:生成屏幕
     
     * 
     
     * Author: Jing Create Date: Dec 19, 2014 11:15:28 AM
     
     * 
     
     * @return void
     
     */
     
    public void createScreen() {
     
     
     
    model.setScreen("Screen Product");
     
    }
     
     
     
    /**
     
     * 
     
     * 方法说明:生成主机
     
     * 
     
     * Author: Jing Create Date: Dec 19, 2014 11:16:12 AM
     
     * 
     
     * @return void
     
     */
     
    public void createMainframe() {
     
     
     
    model.setMainframe("Mainframe Product");
     
    }
     
     
     
    }
     
    /**
     
     *
     
     * @(#) Product.java
     
     * @Package pattern.chp04.builder
     
     * 
     
     * Copyright © JING Corporation. All rights reserved.
     
     *
     
     */
     
     
     
    package pattern.chp04.builder;
     
     
     
    /**
     
     * 类描述:产品类,电脑
     
     * 
     
     * @author: Jing
     
     * @version $Id: Exp$
     
     * 
     
     * History: Dec 19, 2014 11:12:12 AM Jing Created.
     
     * 
     
     */
     
    public class Product {
     
    /**
     
     * 屏幕
     
     */
     
    private String screen;
     
    /**
     
     * 主机
     
     */
     
    private String mainframe;
     
     
     
    /**
     
     * @return the screen
     
     */
     
    public String getScreen() {
     
    return screen;
     
    }
     
     
     
    /**
     
     * @param screen
     
     *            the screen to set
     
     */
     
    public void setScreen(String screen) {
     
    this.screen = screen;
     
    }
     
     
     
    /**
     
     * @return the mainframe
     
     */
     
    public String getMainframe() {
     
    return mainframe;
     
    }
     
     
     
    /**
     
     * @param mainframe
     
     *            the mainframe to set
     
     */
     
    public void setMainframe(String mainframe) {
     
    this.mainframe = mainframe;
     
    }
     
     
     
    }
     
    /**
     
     *
     
     * @(#) Director.java
     
     * @Package pattern.chp04.builder
     
     * 
     
     * Copyright © JING Corporation. All rights reserved.
     
     *
     
     */
     
     
     
    package pattern.chp04.builder;
     
     
     
    /**
     
     *  类描述:产品生成指导类
     
     * 
     
     *  @author:  Jing
     
     *  @version  $Id: Exp$ 
     
     *
     
     *  History:  Dec 19, 2014 11:17:07 AM   Jing   Created.
     
     *           
     
     */
     
    public class Director {
     
     
     
    private IBuilder builder;
     
     
     
    public Director(IBuilder builder) {
     
     
     
    this.builder = builder;
     
    }
     
    /**
     
     * 
     
     * 方法说明:构建产品
     
     *
     
     * Author:       Jing                
     
     * Create Date:   Dec 19, 2014 11:18:31 AM
     
     *
     
     * @return
     
     * @return Product
     
     */
     
    public Product build(){
     
    return builder.create();
     
    }
     
    }

4, 在什么情况下使用建造者模式

以下情况应当使用建造者模式:

1、 需要生成的产品对象有复杂的内部结构。
2、 需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。

使用建造者模式主要有以下效果:

1、 建造模式的使用使得产品的内部表象可以独立的变化。使用建造者模式可以使客户端不必知道产品内部组成的细节。
2、 每一个Builder都相对独立,而与其它的Builder无关。
3、 模式所建造的最终产品更易于控制。