自由扩展——Builder模式

来源:互联网 发布:libreoffice软件 编辑:程序博客网 时间:2024/05/29 16:21

Builder模式

Builder介绍

  • Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。
  • 一个复杂的对象有很多大量组成,如汽车,有车轮、方向盘、发动机、还有各种小零件等,如何将这些部件装配成一辆汽车,这个装配过程很漫长,也很复杂,这种情况下,为了在构建过程中对外部隐藏实现细节,就可以使用Builder模式将部件和组装过程隔离,使得构建过程和部件都可以自由扩展。降低耦合度

Builder模式的定义

  • 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的标识

Builder模式的使用场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果时
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用。
  • 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值

Builder的简单实现

  • 计算机构建

  • Computer

/** * Describe: 构建者模式 Computer实体类 * wx on 2017/1/3. */public abstract class Computer {    /**     * 实体属性     */    protected String mBoard;    protected String mDisplay;    protected String mOs;    protected  Computer(){}    /**     * 设置主板     * @param mBoard     */    public void setmBoard(String mBoard) {        this.mBoard = mBoard;    }    /**     * 设置显示器     * @param mDisplay     */    public void setmDisplay(String mDisplay) {        this.mDisplay = mDisplay;    }    /**     * 设置操作系统 抽象方法     */    public abstract void setOs();    @Override    public String toString() {        return "Computer{" +                "mBoard='" + mBoard + '\'' +                ", mDisplay='" + mDisplay + '\'' +                ", mOs='" + mOs + '\'' +                '}';    }}
  • Computer具体实现
/** * Describe:具体的Computer类 MacBook * wx on 2017/1/3. */public class MacBook extends Computer {    protected MacBook() {    }    @Override    public void setOs() {        mOs = "Mac os x 10.10";    }}
  • Builder 构建对象
/** * Describe:抽象Builder类 用于构建product * wx on 2017/1/3. */public abstract class Builder {    /**     * 设置主板     *     * @param board     */    public abstract void buildBoard(String board);    /**     * 设置显示器     *     * @param display     */    public abstract void buildDisplay(String display);    /**     * 设置操作系统     */    public abstract void buildOs();    /**     * 创建Computer     *     * @return     */    public abstract Computer create();}
  • 具体构建类
/** * Describe: * wx on 2017/1/3. */public class MacBookBuilder extends Builder {    private Computer computer = new MacBook();    @Override    public void buildBoard(String board) {        computer.mBoard = board;    }    @Override    public void buildDisplay(String display) {        computer.mDisplay = display;    }    @Override    public void buildOs() {        computer.setOs();    }    @Override    public Computer create() {        return computer;    }}
  • Director
/** * Describe: 负责构造Computer * wx on 2017/1/3. */public class Director {    Builder builder = null;    public Director(Builder builder) {        this.builder = builder;    }    /**     * 构建对象     * @param board     * @param display     */    public void construct(String board,String display){        builder.buildBoard(board);        builder.buildBoard(display);        builder.buildOs();    }}
  • test
/** * Describe:测试程序 * wx on 2017/1/3. */public class TestBuilder {    public static void main(String[] args) {        Builder builder = new MacBookBuilder();        Director director = new Director(builder);        director.construct("英特尔主板", "Retina显示器");        // TODO: 构建        Computer computer = builder.create();        System.out.println(computer.toString());    }}

Android源码中的设计模式介绍

  • Android源码中的Builder有很广泛的应用,最常见的应该就是Dialog了,例如AlertDialog,这个AlertDialog就是通过Builder的模式,通过Builder对象来组装Dialog的各个部分,由于Android源码还在撸,此处就不贴出分析的代码了

优点

  • 良好的封装性,使用建造者模式可以使得客户端不必知道产品内部组成的细节
  • 建造者独立,容易扩展

缺点

  • 会产生多于的Builder以及其它对象,消耗内存
0 0
原创粉丝点击