设计模式之建造者模式

简述

建造者模式(又称生成器模式)使用多个简单的对象一步一步构建成一个复杂的对象。这种设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

如在开发过程中需要创建一个复杂的对象(计算机对象),这个复杂对象由多个子部件按一定的步骤组合而成,计算机是由 CPU、主板、内存、硬盘、显卡、显示器、键盘等部件组装而成的,一般买电脑我们不会自己去组装计算机,而是将计算机的配置要求告诉销售,销售安排技术人员去组装计算机。
类似这些产品都是由多个部件构成的,各个部件可以灵活选择,但其创建步骤都大同小异。这类产品的创建无法用前面介绍的工厂模式描述,而建造者模式可以很好地描述该类产品的创建。

建造者模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这种设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。

优点:

  1. 封装性好,构建对象过程和对象的表示分离。
  2. 扩展性好,各个具体的建造者相互独立,有利于解耦。
  3. 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响。

缺点:

  1. 产品的组成部分必须相同,这限制了其使用范围。
  2. 如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。

建造者模式和工厂模式的区别:

建造者模式和工厂模式的关注点不同:建造者模式注重部件的组装过程,而工厂方法模式更注重部件的创建过程,但两者可以结合使用,当一些基本部件不会变,而其组合经常变化的时候,可以使用建造者模式。

使用场景

  1. 需要生成的对象具有复杂的内部结构。
  2. 需要生成的对象内部属性本身相互依赖。

建造者模式的结构

建造者模式包含以下主要角色。

  1. 产品:它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
  2. 抽象建造者:它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
  3. 具体建造者:实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  4. 指挥者:它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息

uml类图

代码示例:

package com.tianye.designModel.impl;

/**
 * @author 田野上的风筝
 * @version V1.0
 * @Description: 建造者模式
 * @date 2020/12/7 19:51
 */
public class BuilderModelDemo {
    public static void main(String[] args) {
        Director director = new Director();
        Prod build1 = director.build(new DellComputerBuilder());
        System.out.println(build1);
        Prod build = director.build(new HpComputerBuilder());
        System.out.println(build);
    }
}

//指挥者 抽象建造者 具体建造者 产品
class Director{
    Prod build(Builder builder){
        builder.setCPU();
        builder.setGPU();
        builder.setMemory();
        builder.SetMouse();
        builder.setScreen();
        return builder.build();
    }
}
//抽象建造者 规范建造者生产过程
abstract class Builder{
    abstract void setCPU();
    abstract void setScreen();
    abstract void setMemory();
    abstract void setGPU();
    abstract void SetMouse();
    abstract Prod build();
}
//具体建造者 戴尔
class DellComputerBuilder extends Builder{
    private Prod prod = new Prod();

//    public DellComputerBuilder(Prod prod) {
//        this.prod = prod;
//    }

    @Override
    void setCPU() {
        this.prod.setCpu("i7");
    }

    @Override
    void setScreen() {
        Screen screen = new Screen();
        screen.setName("京东方");
        this.prod.setScreen(screen);

    }

    @Override
    void setMemory() {
        this.prod.setMemory("512G固态+2T机械硬盘");

    }

    @Override
    void setGPU() {
        this.prod.setGpu("1050TI");

    }

    @Override
    void SetMouse() {
        this.prod.setMouse("罗技鼠标");
    }

    @Override
    Prod build() {
        return prod;
    }
}
//具体建造者 惠普

class HpComputerBuilder extends Builder{
    private Prod prod = new Prod();

//    public DellComputerBuilder(Prod prod) {
//        this.prod = prod;
//    }

    @Override
    void setCPU() {
        this.prod.setCpu("i5");
    }

    @Override
    void setScreen() {
        Screen screen = new Screen();
        screen.setName("京东方1");
        this.prod.setScreen(screen);

    }

    @Override
    void setMemory() {
        this.prod.setMemory("128G固态+1T机械硬盘");

    }

    @Override
    void setGPU() {
        this.prod.setGpu("ctx 1050");

    }

    @Override
    void SetMouse() {
        this.prod.setMouse("雷神鼠标");
    }

    @Override
    Prod build() {
        return prod;
    }
}
//产品
class Prod{
    private String cpu;
    private String gpu;
    private String memory;
    private String mouse;
    private Screen screen;

    public String getCpu() {
        return cpu;
    }

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

    public String getGpu() {
        return gpu;
    }

    public void setGpu(String gpu) {
        this.gpu = gpu;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getMouse() {
        return mouse;
    }

    public void setMouse(String mouse) {
        this.mouse = mouse;
    }

    public Screen getScreen() {
        return screen;
    }

    public void setScreen(Screen screen) {
        this.screen = screen;
    }

    @Override
    public String toString() {
        return "Prod{" +
                "cpu='" + cpu + '\'' +
                ", gpu='" + gpu + '\'' +
                ", memory='" + memory + '\'' +
                ", mouse='" + mouse + '\'' +
                ", screen=" + screen +
                '}';
    }
}
//屏幕
class Screen{
    private String name;

    @Override
    public String toString() {
        return "Screen{" +
                "name='" + name + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

运行mian方法,效果

总结:建造者模式,适用于创建有复杂内部结构的对象,子部件之间相互依赖。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值