设计模式—创建型—构建者模式

理解

  • 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 比如装电脑,我们只需要提供各个部件(cpu,主板,显卡)的配置。其他事我们不用管,交给电脑商家。

术语

  • Director: 指挥者类,用于统一组装流程,对外暴露一个方法让客户传递电脑的型号参数即可,构造者模式隐藏构造流程细节的体现。
  • Builder:抽象Builder类,规范产品的组建,注意这里的组建并不要和上面的Director的组建搞混了,这里的组建只是分解出”每一个”部件的”细节上的”组建技术,而并非是整个流程下来的按流程的组建。另外它是一个抽象接口,具体的实现细节又接下来的角色进行。
  • ConcreteBulider: 抽象Builder类的实现类,实现抽象Builder类定义的所有方法,并且返回一个组建好的对象。
  • Product: 产品类

图片转自刘望舒的博客:http://liuwangshu.cn/designpatterns/3-builder.html

这张图分析一下:
1.Builder是属于Director的一员(聚合)。因为Director需要使用Builder的各个细节的组建方法用正确的顺序来组建一台电脑。
2.ConcreteBuilder是Builder的子类/实现类(继承/实现)。
3.Product被ConcreteBuilder产出(依赖)。

代码实践

Computer.java


package com.zj.dp.构建者模式;

public class Computer {

    private String mCpu;
    private String mMainBorad;
    private String mVideoCard;

    public Computer() {
    }

    @Override
    public String toString() {
        return "Computer{" +
                "mCpu='" + mCpu + '\'' +
                ", mMainBorad='" + mMainBorad + '\'' +
                ", mVideoCard='" + mVideoCard + '\'' +
                '}';
    }

    public Computer(String mCpu, String mMainBorad, String mVideoCard) {
        this.mCpu = mCpu;
        this.mMainBorad = mMainBorad;
        this.mVideoCard = mVideoCard;
    }

    public String getCpu() {
        return mCpu;
    }

    public void setCpu(String mCpu) {
        this.mCpu = mCpu;
    }

    public String getMainBorad() {
        return mMainBorad;
    }

    public void setMainBorad(String mMainBorad) {
        this.mMainBorad = mMainBorad;
    }

    public String getVideoCard() {
        return mVideoCard;
    }

    public void setVideoCard(String mVideoCard) {
        this.mVideoCard = mVideoCard;
    }
}

Builder.java

package com.zj.dp.构建者模式;

public interface Builder {
    void installCpu(String cpu);
    void installMainCard(String mainCard);
    void installVideoCard(String showCard);
    Computer create();
}

LogicComputerBuilder.java


package com.zj.dp.构建者模式;

public class LogicComputerBuilder implements Builder{

    Computer mComputer = new Computer();

    @Override
    public void installCpu(String cpu) {
        mComputer.setCpu(cpu);
    }

    @Override
    public void installMainCard(String mainCard) {
        mComputer.setMainBorad(mainCard);
    }

    @Override
    public void installVideoCard(String videoCard) {
        mComputer.setVideoCard(videoCard);
    }

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

}

Director.java


package com.zj.dp.构建者模式;

/**
 * 商家的指挥者类用来规范组装电脑的流程规范
 * <p>
 * 先安装主板
 * 再安装CPU
 * 最后安装内存并组装成电脑:
 */
public class Director {

    Builder mBuilder = null;

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

    public Computer CreateComputer(String cpu, String mainBoard, String videoCard) {
        this.mBuilder.installCpu(cpu);
        this.mBuilder.installMainCard(mainBoard);
        this.mBuilder.installVideoCard(videoCard);
        return mBuilder.create();
    }
}

TestBuildler.java


package com.zj.dp.构建者模式;

public class TestBuildler {

    public static void main(String[] args) {
        LogicComputerBuilder logicComputerBuilder = new LogicComputerBuilder();
        Director director = new Director(logicComputerBuilder);
        Computer computer = director.CreateComputer("intel-i7-8700k", "技嘉-Z370", "NVIDIA-1080-Ti");
        System.out.println(computer.toString());
    }

}

输出

输出:Computer{mCpu='intel-i7-8700k', mMainBorad='技嘉-Z370', mVideoCard='NVIDIA-1080-Ti'}

本文Demo

https://github.com/zj614android/designPattern/tree/master/app/src/main/java/com/zj/dp/%E6%9E%84%E5%BB%BA%E8%80%85%E6%A8%A1%E5%BC%8F

Thnaks

刘望舒:http://liuwangshu.cn/designpatterns/3-builder.html

猜你喜欢

转载自blog.csdn.net/user11223344abc/article/details/81182850