2.Builder模式--自由扩展你的项目

2019-03-04  本文已影响0人  君袅

一.定义

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示.
Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户不知道内部构建细节的情况下,可以更精细的控制对象的构造流程.
该模式是为了将构建该对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来.

二.使用场景

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

三.简单实现

抽象类

public abstract class Computer {
    public Computer() {
    }
    //主板
    protected String board;
    //显示器
    protected String display;
    //操作系统
    protected String os;

    protected void setBoard(String board){
        this.board = board;
    };

    protected  void setDisplay(String display){
        this.display = display;
    };

    protected  void setOs(){};

    @Override
    public String toString() {
        return "Computer{" +
                "board='" + board + '\'' +
                ", display='" + display + '\'' +
                ", os='" + os + '\'' +
                '}';
    }

}
public abstract class ComputerBuilder {
    //设置主机
    protected abstract ComputerBuilder buildBoard(String board);
    //设置显示器
    protected abstract ComputerBuilder buildDisplay(String display);
    //设置操作系统
    protected abstract ComputerBuilder buildOs();
    //创建Computer
    protected abstract Computer build();
}
public class MacBook extends Computer {
    @Override
    protected void setOs() {
        this.os = "Mac 系统";
    }
}
public class MacBuilder extends ComputerBuilder {

    Computer mComputer = new MacBook();
    @Override
    public MacBuilder buildBoard(String board) {
        mComputer.setBoard(board);
        return this;
    }
    @Override
    public MacBuilder buildDisplay(String display) {
        mComputer.setDisplay(display);
        return this;
    }
    @Override
    public MacBuilder buildOs() {
        mComputer.setOs();
        return this;
    }
    @Override
    public Computer build() {
        return mComputer;
    }
}

实现效果

    private void build() {
        Computer computer = new MacBuilder().buildBoard("Intel 主板")
                .buildDisplay("Retina 显示器")
                .buildOs()
                .build();

        Log.d(TAG, "computer: " + computer.toString());
    }
上一篇 下一篇

猜你喜欢

热点阅读