Android开发经验谈Android技术知识

设计模式——Builder模式

2019-03-27  本文已影响4人  AndroidDMW

1.Builder模式介绍

Builder模式是一步一步创建一个复杂对象的创建型模式,可以让使用者在不知道内部构造细节的情况下精确控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使构建过程和部件的表示隔离开。

2.Builder模式定义

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

3.Builder模式使用场景

3.Builder模式UML类图

Builder模式UML类图(摘自网络)

类图解析:

4.实例解析

4.1实例背景

组装计算机,过程简化为:构建主机、设置操作系统、设置显示器。

4.2构建计算机类,即Product角色
//计算机抽象类
public abstract class Computer{
    protected String mBoard;
    protected String mDisplay;
    protected String mOs;
  
    protected Computer(){}
    //设置主板
    public void setBoard(String board){
        mBoard = board;
    }
    //设置显示器
    public void setDisplay(String display){
        mDisplay= display;
    }
    //设置操作系统
    public abstract void setOS();

    @Override
    public String toString() {
        return "Computer [mBoard=" + mBoard+ ", mDisplay=" + mDisplay +
                ", mOs=" + mOs+ "]";
    }
}
//具体的计算机类,Macbook
public class Macbook extends Computer {
    protected Macbook (){}
    
    @Override
    public void setOS() {
        mOs = "Mac OS X 10";    //设置默认操作系统
    }
}
4.3构建抽象Builder类
public abstract class Builder {
    //设置主机
    public abstract void buildBoard(String board);
    //设置显示器
    public abstract void buildDisplay(String display);
    //设置操作系统
    public abstract void buildOS();
    //创建计算机类
    public abstract Computer create();
}
4.3构建具体的Builder类
public class MacbookBuilder extends Builder{

    private Computer mComputer = new Macbook();

    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }
    @Override
    public void buildDisplay(String display) {
        mComputer.setDisplay(display);
    }
    @Override
    public void buildOS() {
        mComputer.setOS();
    }
    @Override
    public Computer create() {
        return mComputer;
    }
}
4.3构建Director类 构造Computer
public class Director {
    Builder mBuilder =null;

    public Director(Builder builder){
        this.mBuilder =builder;
    }
    //构建对象
    public void construct(String board, String display){
        mBuilder.buildBoard(board);
        mBuilder.buildDisplay(display);
        mBuilder.buildOS();
    }
}
4.4测试
public class Test {
    public static void main (String[] args) {
        //构造器
        Builder builder = new MacbookBuilder ();
        //Director
        Director mDirector = new Director ();
        mDirector.construct("英特尔主板", "Dell显示器 ");
        System.out.println("Computer Info : "+ builder.create().toString);
    }
}

输出结果

Computer Info :Computer [mBoard=英特尔主板, mDisplay=Dell显示器, mOs=Mac OS X 10]

5.Builder模式精简

现实开发中,Director角色经常会被省略而直接用一个Builder来进行对象的组装,这个Builder通常为链式调用,关键点是每个set方法都返回自身,也就是return this,代码大致如下

  new TsetBuilder().setA("A").set("B").create();

通过这种形式不进去除了Director角色,整个结构也更加简单,也可以对Product对象的组装过程更加精细控制。
建议查看Android源码AlertDialog实现,AlertDialog.Builder同时扮演了Builder、ConcreteBuilder、Director的角色,简化了Builder模式的设计!

5.Builder模式总结

上一篇下一篇

猜你喜欢

热点阅读