MENU

《Java设计模式及实践》第二章读书笔记 建造者模式

May 15, 2022 • 《Java设计模式及实践》

建造者模式

使用场景:

  1. 多个部件或者零件,都可以装配到一个对象中,但是产生的运行结果又相同。
  2. 产品类非常复杂,或者产品类中调用顺序不同产生了不同的作用。
  3. 初始化一个对象特别复杂,如使用多个构造方法,或者说有很多参数,并且都有默认值时。
建造者模式类的组成
  • Product(产品类):需要为其构建对象的类,是具有不同表现形式的复杂或复合类对象。
  • Builder(抽象建造者类):用于声明构建产品类的组成部分的抽象类或接口,作用是仅公开构建产品类的功能,隐藏其他功能。
  • ConcreteBuilder(具体建造者类):实现抽象建造者类中声明的方法。
  • Director(导演类):用于指导如何构建对象的类,在某些建造者模式的变体中移除了导演类,其角色被客户端或抽象建造者类所替代。

1. 普通建造者模式

UML图

5249989-47951dd84e86a38d

//Computer.java    产品抽象类
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) {
        this.mDisplay = display;
    }

    public abstract void setOs();
}
//MacBook.java
public class MacBook extends Computer {
    @Override
    public void setOs() {
        mOs="Mac OS X 12";
    }
}
//Builder.java    抽象建造者类
public abstract class Builder {
    abstract void buildBoard(String board);
    abstract void buildDisplay(String display);
    abstract void buildOs();
    abstract Computer build();
}
//MacBookBuilder.java    具体建造者类
public class MacBookBuilder extends Builder {
    private Computer mComputer = new MacBook();

    @Override
    void buildBoard(String board) {
        mComputer.setBoard(board);
    }

    @Override
    void buildDisplay(String display) {
        mComputer.setDisplay(display);
    }

    @Override
    void buildOs() {
        mComputer.setOs();
    }

    @Override
    Computer build() {
        return mComputer;
    }
}
//Director.java    导演类
public class Director {
    private Builder builder = null;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public void construct(String board, String display) {
        builder.buildDisplay(display);
        builder.buildBoard(board);
        builder.buildOs();
    }
}
//Main.java
public class Main {
    public static void main(String[] args) {
        Builder builder = new MacBookBuilder();
        Director director = new Director(builder);
        director.construct("英特尔主板", "Retina显示器");
        Computer computer = builder.build();
        System.out.println(computer.toString());
    }
}

2. 链式建造者模式(推荐)

上面那部分代码可以看出普通的建造者模式有点复杂,且调用时不够简单。

这时可以使用更简单好用的链式建造者模式。如果不想自己敲的话可以使用IDEA中的一个叫InnerBuilder插件进行自动生成。

public class Computer {
    protected String mBoard;
    protected String mDisplay;

    protected Computer() {
    }

    private Computer(Builder builder) {
        mBoard = builder.mBoard;
        mDisplay = builder.mDisplay;
    }

    public void setBoard(String board) {
        mBoard = board;
    }

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

    @Override
    public String toString() {
        return "Computer{" +
                "mBoard='" + mBoard + '\'' +
                ", mDisplay='" + mDisplay + '\'' +
                '}';
    }


    /**
     * InnerBuilder插件生成的链式建造者类
     */
    public static final class Builder {
        private String mBoard;
        private String mDisplay;

        public Builder() {
        }

        public Builder mBoard(String val) {
            mBoard = val;
            return this;
        }

        public Builder mDisplay(String val) {
            mDisplay = val;
            return this;
        }

        public Computer build() {
            return new Computer(this);
        }
    }
}
//Main.java
public class Main {
    public static void main(String[] args) {
        Computer computer = new Computer.Builder()
                .mBoard("intel atx")
                .mDisplay("1920x1080")
                .build();
    }
}

Git 代码

Sundae97/Design-Patterns-Java