您现在的位置是:首页 > 正文

设计模式(创建型)---建造者模式

2024-02-29 14:19:38阅读 1

概述

建造者模式将一个对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

核心构成

1.Builder:抽象建造者,定义多个通用方法和构建方法
2.ConcreteBuilder:具体建造者,实现Builder接口,可以有多个
3.Director:指挥者,控制建造流程,并交给具体建造者,由具体建造者去创建对象
4.Product:产品,需要被建造的类

举例说明

以手机为例

/**
 * 产品
 */
public class Phone {

    //cpu
    private String cpu;

    //内存
    private String memory;

    //电池
    private String battery;

    //相机
    private String camera;

    public String getCpu() {
        return cpu;
    }

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

    public String getMemory() {
        return memory;
    }

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

    public String getBattery() {
        return battery;
    }

    public void setBattery(String battery) {
        this.battery = battery;
    }

    public String getCamera() {
        return camera;
    }

    public void setCamera(String camera) {
        this.camera = camera;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", battery='" + battery + '\'' +
                ", camera='" + camera + '\'' +
                '}';
    }
}

抽象建造者

/**
 * 抽象建造者
 */
public interface Builder {

    void buildCpu();

    void buildMemory();

    void buildBattery();

    void buildCamera();

    Phone createPhone();

}

具体建造者,实现抽象建造者接口

public class ApplePhoneBuilder implements Builder{

    private Phone phone = new Phone();

    @Override
    public void buildCpu() {
        phone.setCpu("A14处理器");
    }

    @Override
    public void buildMemory() {
        phone.setMemory("4GB内存");
    }

    @Override
    public void buildBattery() {
        phone.setMemory("2000mAh电池");
    }

    @Override
    public void buildCamera() {
        phone.setCamera("原画相机");
    }

    @Override
    public Phone createPhone() {
        return phone;
    }
}

指挥者,定义一个create方法,入参是抽象建造者类型的变量,调用具体建造者的构建方法返回建造好的对象

/**
 * 指挥者
 */
public class Director {

    public Phone create(Builder builder){

        builder.buildCpu();
        builder.buildMemory();
        builder.buildBattery();
        builder.buildCamera();

        return builder.createPhone();
    }
}

测试

public class BuilderTest {
    public static void main(String[] args) {
        Phone applePhone = new Director().create(new ApplePhoneBuilder());
        System.out.println(applePhone.toString());
    }
}

输出
在这里插入图片描述

优点

封装性好,构建和表示分离。
扩展性好,各个具体的建造者相互独立,有利于系统的解耦。
可以对创建过程逐步细化,而不对其它模块产生任何影响。

缺点

产品的组成部分必须相同,限制了使用范围。

网站文章

  • 选择法排序(c语言)

    选择法排序:是指先将a[0]~a[n]中的最小元素与a[0]交换;再将a[1]~a[n]中的最小元素与a[1]交换……,每进行一轮比较,找出当前未排序数中的最小元素。比较n-1轮后,排序结束。

    2024-02-29 14:19:29
  • 洛谷P4145——上帝造题的七分钟2 / 花神游历各国

    洛谷P4145——上帝造题的七分钟2 / 花神游历各国

    题目背景 XLk觉得《上帝造题的七分钟》不太过瘾,于是有了第二部。 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列。 第二分钟,L说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作。 第三分钟,k说,要能查询,于是便有了求一段数的和的操作。 第四分钟,彩虹喵说,要是noip难度,于是便有了数据范围。 第五分钟,诗人说,要有韵律,...

    2024-02-29 14:19:20
  • CSS 标签位于页面中央

    调整前端是在 p 标签下面添加了一个超链接发现 a 标签一致在页面左侧。 这种情况需要将a标签设定为一个块即 display:block 然后使用margin:0 auto即可将 超链接垂直居中布置。 ...

    2024-02-29 14:17:11
  • 【项目实战17.5】k8s(3.5)—pod生命周期和探针

    【项目实战17.5】k8s(3.5)—pod生命周期和探针

    Pod生命周期一、生命周期简介Pod 遵循一个预定义的生命周期,起始于 Pending 阶段,如果至少其中有一个主要容器正常启动,则进入 Running,之后取决于 Pod 中是否有容器以失败状态结束...

    2024-02-29 14:17:04
  • 引用vitamio框架提示libffmpeg.so、libstlport_shared.so无法找到的错误

    引用vitamio框架提示libffmpeg.so、libstlport_shared.so无法找到的错误

    一波三百六十折...问题似乎不止一个,而且总觉得自己已经完美解决了然而没有,所以文章可读性极差,我把解决的方案扔在一个“解决方案”的一级标题下面,读者可以直接点目录跳转。 一开始写博客的时候,就其实有个疑惑, https://blog.csdn.net/nishigesb123/article/details/89554881 官网新手入门 提供的项目地址 和下载链接导向的地址有...

    2024-02-29 14:16:55
  • java的编译原理_java学习编译原理

    java的编译原理_java学习编译原理

    一个.java文件的"沉浮"之路1:引言:昨天的分享大概分为一下几个模块来讲解的:2:分享初衷:基于以上内容,希望能够找到一些技术。分享给大家,而这些技术必须具备如下特征:可能实用...

    2024-02-29 14:14:29
  • idea2021导入Gradle工程

    idea2021导入Gradle工程

    1、官网下载gradle-6.1版本,最好是原始构建项目的那个版本 2、配置gradle环境变量 3、保存确定后在cmd中执行gradle -v 4、在idea中打开gradle构建的项目 5、选择File->Settings->Build Tools->Gradle ...

    2024-02-29 14:14:20
  • 正则表达式的非捕获性分组

    非捕获性分组,通常由一对括号加上 ?: 加上子表达式组成,非捕获性分组不会创建反向引用,就好像没有括号一样。如下: var color = "#808080"; var outpu...

    2024-02-29 14:14:14
  • 虚函数 java_Java中的虚函数是什么?

    Java是一种面向对象的编程语言,它支持多态、继承、抽象等概念。这些OOPs概念围绕类、对象和成员函数展开。虚函数是一个有助于运行时多态性的概念。在这个博客中,我们将学习javaJava是一种面向对象...

    2024-02-29 14:10:28
  • Linux 中断( IRQ / softirq )基础:原理及内核实现 最新发布

    Linux 中断( IRQ / softirq )基础:原理及内核实现 最新发布

    中断(IRQ),尤其是软中断(softirq)的重要使用场景之一是网络收发包, 但并未唯一场景。本文整理 IRQ/softirq 的通用基础,这些东西和网络收发包没有直接关系, 虽然整理本文的直接目的...

    2024-02-29 14:10:17