Java设计模式之构建者模式

Java设计模式之构建者模式

    • 构建者模式概述
      • 构建这模式的组成
    • 构建者模式的优缺点及适用场景
    • 构建者模式四步骤

构建者模式概述

构建者模式:构建者模式隐藏了复杂对象的创建过程,将一个复杂对象的创建和对象的表示进行分离,使得同样的构建过程可以创建不同的表示。它是创建型设计模式之一。

构建这模式的组成

一般情况下,构建者模式由以下四个部分组成:

  1. Builder: 抽象构造者对复杂对象的创建过程加以抽象,给出一个抽象接口,以规范产品对象的各个组成部分的建造。这个接口规定了要实现复杂对象的哪个部分的创建,但并不涉及具体对象不见的创建,一般由子类实现
  2. ConcreteBuilder: 具体的构造者实现Builder类中定义的所有抽象方法,并且返回一个组建好的对象。
  3. Product: 产品类构造者最终构造的对象
  4. Director:导演类主要用于负责安排已有模块的顺序,然后通知Builder开始构建

构建者模式的优缺点及适用场景

适用场景:
需要生成的产品对象有复杂的内部结构,并且这些产品对象具备相同的特性

优点:

  1. 具体的构建者之间相互独立、互不影响,易于扩展符合“开闭原则”
  2. 将复杂产品的表示和创建过程进行分离,易于解耦

缺点

  1. 产生多余的Builder对象以及导演类
  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

构建者模式四步骤

此处已构建智能手机为例,详细的解释都在代码中标注,这里不做过多解释
1:构建产品类Product: 智能手机Phone

/**
 * Copyrights (c) 2019 All Rights Reserved
 * author : 马彦虎 Ehud
 * e-mail : [email protected]
 * date   : 2019/4/15/20:08
 *
 * desc   :  智能手机的一般组成: cpu 手机键盘  主板  屏幕  相机  这就是我们要构建的复杂对象  即Product
 *           这里通过get和set方法简单模拟复杂对象的各个部分的构建,意在理解
 */
public class Phone {
    private String cpu;
    private String keyboard;
    private String processor;
    private String screen;
    private String camera;
    public String getCpu() {
        return cpu;
    }
    public void setCpu(String cpu) {
        this.cpu = cpu;
    }
    public String getKeyboard() {
        return keyboard;
    }
    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }
    public String getProcessor() {
        return processor;
    }
    public void setProcessor(String processor) {
        this.processor = processor;
    }
    public String getScreen() {
        return screen;
    }
    public void setScreen(String display) {
        this.screen = display;
    }
    public String getCamera() {
        return camera;
    }
    public void setCamera(String camera) {
        this.camera = camera;
    }
    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", keyboard='" + keyboard + '\'' +
                ", processor='" + processor + '\'' +
                ", screen='" + screen + '\'' +
                ", camera='" + camera + '\'' +
                '}';
    }
}

2:构建抽象构建者Builder

/**
 * Copyrights (c) 2019 All Rights Reserved
 * author : 马彦虎 Ehud
 * e-mail : [email protected]
 * date   : 2019/4/15/20:14
 * desc   :  抽象构建者  :不涉及具体的构建过,具体的构建由子类实现
 * version: ${VERSIONCODE}
 */
public abstract class Builder {
    protected abstract void buildCpu();  //构建手机Cpu
    protected abstract void buildKeyboard();//造键盘
    protected abstract void buildProcessor();//造主板
    protected abstract void buildScreen();//造手机屏
    protected abstract void buildCamera();//造摄像机
    protected abstract Phone build();//提供一个获取复杂对象的方法
}

3:构建具体的构建者ConcreteBuilder:
华为手机构建者BuilderHuawei

/**
 * Copyrights (c) 2019 All Rights Reserved
 * author : 马彦虎 Ehud
 * e-mail : [email protected]
 * date   : 2019/4/15/20:27
 * desc   :
 * 具体的构建者:构建华为手机
 *         这里只是简单的模拟了产品的各个部分的构建过过程,以便理解,其实每一步都可能有更加复杂的构建过程
 *         而且苹果和华为的构建者互不影响,易于扩展功能
 *
 */
public class BuilderHuawei extends Builder {
    private Phone mPhone =new Phone();
    @Override
    protected void buildCpu() {
        mPhone.setCpu("构建  华为的  cpu");
    }
    @Override
    protected void buildKeyboard() {
        mPhone.setCpu("构建  华为的  键盘");
    }
    @Override
    protected void buildProcessor() {
        mPhone.setCpu("构建  华为的  主板");
    }
    @Override
    protected void buildScreen() {
        mPhone.setCpu("构建  华为的  的全面屏");
    }
    @Override
    protected void buildCamera() {
        mPhone.setCpu("构建  华为的  摄像机");
    }
    @Override
    protected Phone build() {
        return mPhone;
    }
}

苹果手机构建者BuilderIphone

/**
 * Copyrights (c) 2019 All Rights Reserved
 * author : 马彦虎 Ehud
 * e-mail : [email protected]
 * date   : 2019/4/15/20:16
 * desc   :  BuilderIphone  构建苹果手机   具体的构建者
 * 具体的构建者:
 *         这里只是简单的模拟了产品的各个部分的构建过过程,以便理解,其实每一步都可能有更加复杂的构建过程
 *         而且苹果和华为的构建者互不影响,易于扩展功能
 */
public class BuilderIphone extends Builder {
    private Phone mPhone =new Phone();
    @Override
    protected void buildCpu() {
        mPhone.setCpu("构建  iphonex  cpu");
    }
    @Override
    protected void buildKeyboard() {
        mPhone.setCpu("构建  iphonex  键盘");
    }
    @Override
    protected void buildProcessor() {
        mPhone.setCpu("构建  iphonex  主板");
    }
    @Override
    protected void buildScreen() {
        mPhone.setCpu("构建  iphonex  的全面屏");
    }
    @Override
    protected void buildCamera() {
        mPhone.setCpu("构建  iphonex  摄像机");
    }
    @Override
    protected Phone build() {
        return mPhone;
    }
}

4:构建Director安排已有模块的构建顺序,通知构建者构建

/**
 * Copyrights (c) 2019 All Rights Reserved
 * author : 马彦虎 Ehud
 * e-mail : [email protected]
 * date   : 2019/4/15/20:19
 * desc   :导演:
 *    负责安排具体构建者的构建过程
 */
public class BuilderDirector {
    private Builder mBuilder;
    public BuilderDirector (Builder builder){
        mBuilder=builder;
    }
    public Phone build(){
        mBuilder.buildCpu();
        mBuilder.buildCamera();
        mBuilder.buildKeyboard();
        mBuilder.buildProcessor();
        mBuilder.buildScreen();
        return mBuilder.build();
    }
}

5:使用

/**
 * Copyrights (c) 2019 All Rights Reserved
 * author : 马彦虎 Ehud
 * e-mail : [email protected]
 * date   : 2019/4/15/20:23
 * desc   :
 * version: ${VERSIONCODE}
 */
public class TestBuilder {
    public static void main(String[] args) {
       //通过Director获取构建的Phone对象
        Phone phoneHuawei=new BuilderDirector(new BuilderHuawei()).build();
        System.out.println("构建的华为手机 = " + phoneHuawei.toString());
        Phone iphone = new BuilderDirector(new BuilderIphone()).build();
        System.out.println("构建的苹果手机= " + iphone.toString());
    }
}

你可能感兴趣的:(Java设计模式,Java设计模式,构建者模式,Builder)