天天看点

设计模式——Builder模式

一、概念

将一个复杂对象的构建过程和它的表示分离,使得相同的构建过程创建不同的表示。

二、UML类图

UML类图如下图所示。

角色介绍:

Product产品类-产品的抽象类

Builder-抽象的Builder类,规范产品的组建,一般是由子类实现具体的组建过程;

ConcreteBuilder——具体的Bilder类;

Director——统一组装过程

设计模式——Builder模式

三、使用场景

1、相同的方法,不同执行顺序,产生不同的事件结果时。

2、多个部件或零件,都可以装配到同一个对象,但是产生运行结果又不相同时。

3、产品类非常复杂,或者产品类地中的调用顺序不同产生不同的作用,这个时候使用非常合适。

4、当初始化一个对象非常复杂,如参数多,且很多的参数都具有默认值。

四、代码实现

public abstract class Computer {
    protected String mBroad;
    protected String mDisplay;
    protected String mOS;

    protected Computer() {

    }

    public void setmBroad(String mBroad) {
        this.mBroad = mBroad;
    }

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

    public abstract void setmOS();

    @Override
    public String toString() {
        return "Computer [mBroad=" + mBroad + ", mDisplay=" + mDisplay
                + ", mOS=" + mOS + "]";
    }

}
           
public class MacBook extends Computer {

    @Override
    public void setmOS() {
        mOS = "Mac os x 12";
    }

}
           
public abstract class Builder {
    // 设置主机
    public abstract void setBuilderBoard(String borad);

    // 设置显示器
    public abstract void setBuilderDisplay(String display);

    // 设置操作系统
    public abstract void setBuilderOS();

    // 创建计算机
    public abstract Computer createComputer();
}
           
public class MacBuilder extends Builder {
    private Computer maComputer = new MacBook();

    @Override
    public void setBuilderBoard(String borad) {
        maComputer.setmBroad(borad);

    }

    @Override
    public void setBuilderDisplay(String display) {
        maComputer.setmDisplay(display);

    }

    @Override
    public void setBuilderOS() {
        maComputer.setmOS();

    }

    @Override
    public Computer createComputer() {
        // TODO Auto-generated method stub
        return maComputer;
    }

}
           
public class Director {
    Builder mBuilder = null;

    public Director(Builder builder) {
        mBuilder = builder;
    }

    public void construct(String borad, String display) {
        mBuilder.setBuilderBoard(borad);
        mBuilder.setBuilderDisplay(display);
        mBuilder.setBuilderOS();
    }
}
           
public class Test {
    public static void main(String[] args) {
        Builder macBook = new MacBuilder();
        Director director = new Director(macBook);
        director.construct("英特尔", "Retina显示器");
        System.out.println(macBook.createComputer());
    }
}
           

五、总结

优点:

1、良好的封装性,可以使客户端不用知道产品内部组装的过程。

2、建造者独立,可扩展性强。

缺点:

会产生多余的Builder对象和Director对象,消耗内存

继续阅读