关闭

Android Builder模式分析(链式调用)

标签: Builderandroid链式调用模式
541人阅读 评论(0) 收藏 举报
分类:

Android Builder模式分析(链式调用)

近来在一本书上看到Builder模式的介绍,发现很重要所以就深究下,下面做个简单的回顾。

  • 定义
  • 使用场景
  • 简单案例

Builder模式定义

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

Builder模式

1.相同的方法,不同的执行顺序,产生不同的事件结果时;
2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时;
3.产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适;
4.当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时;

案例分析

说了这些也许你还没有一个具体的认识,接下来看一个简单的例子帮助你理解。
先看看测试代码部分的实现:

代码块

Test.java

package com.example.zyzhang03;

public class Test {

    /**
     * 测试代码
     * @param args
     */
    public static void main(String[] args) {

        Builder builder = new MackbookBuild();

        System.out.println(builder
             .buildBoard("因特尔主板")
             .buildDisplay("Retina 显示器")
             .buildOS()
             .create().toString());
    }
}

接下来我们定义一个计算机抽象类(我们的产品角色),它的零件有主机,显示器,操作系统 …。
Computer.java

package com.example.zyzhang03;

public abstract class Computer {

    protected String mBoard;
    protected String mDisplay;
    protected String mOS;

    protected Computer() {
    }

    public void setmBoard(String mBoard) {
        this.mBoard = mBoard;
    }

    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类,例如:Macbook
Macbook.java

package com.example.zyzhang03;

public class Macbook extends Computer {

    protected Macbook(){

    }
    @Override
    public void setOS() {
        mOS = "MAC OS X 10.10";
    }
}

紧接着是我们的Builder类的实现
Builder.java

package com.example.zyzhang03;

public abstract class Builder {
    //设置主机
    public abstract MackbookBuild buildBoard(String board);
    //设置显示器
    public abstract MackbookBuild buildDisplay(String display);
    //设置操作系统
    public abstract MackbookBuild buildOS();
    //创建Computer
    public abstract Computer create();
}

然后我们通过具体的Builder类来实现相应的操作
MackbookBuild.java

package com.example.zyzhang03;

public class MackbookBuild extends Builder {

    private Computer mComputer = new Macbook();

    @Override
    public MackbookBuild buildBoard(String board) {
        mComputer.setmBoard(board);
        return this;
    }

    @Override
    public MackbookBuild buildDisplay(String display) {
        mComputer.setmDisplay(display);
        return this;
    }

    @Override
    public MackbookBuild buildOS() {
        mComputer.setOS();
        return this;
    }

    @Override
    public Computer create() {
        return mComputer;
    }
}

完成到这一个简单的例子已经实现了,测试结果如下:

Computer [mBoard=因特尔主板, mDisplayRetina 显示器,mOSMAC OS X 10.10]

初出茅庐,如有错误望理解。感觉挺重要的,比如开源的图片缓存(UIL)中就是这样实现的。
这里写图片描述

对以上代码进行一个修改感觉更加清晰

测试类代码 TestBuilder.java

package com.example.zyzhang05;

/**
 * @author zyzhang
 * @date 2015-12-8 下午4:54:33
 */
public class TestBuilder {

    /**
     * @param args
     */
    public static void main(String[] args) {

        ComputerModule.Builder builder = new ComputerModule.Builder();

        builder.buildOS("Mac Pro").buildBoard("因特尔主板 ").buildDisplay("Retina显示器").build();

    }

}

电脑部件 ComputerModule.java

package com.example.zyzhang05;

/**
 * 组件
 * 
 * @author zyzhang
 * @date 2015-12-8 下午4:55:05
 */
public class ComputerModule {

    private String OS;
    private String board;
    private String display;

    ComputerProcess mComputerProcess;

    public ComputerModule() {
        mComputerProcess = new ComputerProcess();
    }

    // 内部类
    static class Builder {

        private final ComputerProcess.MParams P;

        public Builder() {
            P = new ComputerProcess.MParams();
        }

        public Builder buildBoard(String board) {
            P.board = board;
            return this;
        }

        public Builder buildDisplay(String display) {
            P.display = display;
            return this;
        }

        public Builder buildOS(String OS) {
            P.OS = OS;
            return this;
        }

        public void build() {
            ComputerModule mComputerM = new ComputerModule();
            P.apply(mComputerM.mComputerProcess);
        }

    }

}

电脑组装 ComputerProcess.java

package com.example.zyzhang05;

/**
 * 组装过程
 * 
 * @author zyzhang
 * @date 2015-12-8 下午5:35:20
 */
public class ComputerProcess {

    private String mboard;
    private String mdisplay;
    private String mOS;

    /**
     * 构造器
     */
    public ComputerProcess() {

    }

    public void setBoard(String board) {
        // 组装主板
        mboard = board;
    }

    public void setDisplay(String display) {
        // 组装显示器
        mdisplay = display;

    }
    public void setOS(String OS) {
        // 系统
        mOS = OS;

    }

    /**
     * 组装结果
     */
    public void result(){
        System.out.println("组装结果:\n"+mOS+"\n"+mboard+"\n"+mdisplay);
    }

    public static class MParams {

        String board;
        String display;
        String OS;

        public void apply(ComputerProcess mComputerProcess) {

            mComputerProcess.setOS(OS);
            mComputerProcess.setBoard(board);
            mComputerProcess.setDisplay(display);
            mComputerProcess.result();

        }

    }

}

如不合理欢迎指出,共同学习。。。谢谢

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:20008次
    • 积分:399
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论