java设计模式之建造者模式(Builder Pattern)

2023-05-16

目的:将产品与产品的创建过程解耦  。他是按照相应的步骤来构建产品

下面看一下UML序列图 

 

 对于序列图的一个解释

 下面来上一个标准代码

Product.java

package com.pxx;

public class Product {
    private String shape;
    private int height;
    private String color;

    public Product(String shape, int height, String color) {
        this.shape = shape;
        this.height = height;
        this.color = color;
    }

    public String getShape() {
        return shape;
    }

    public void setShape(String shape) {
        this.shape = shape;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "com.pxx.Product{" +
                "shape='" + shape + '\'' +
                ", height=" + height +
                ", color='" + color + '\'' +
                '}';
    }

}

 建造者的抽象类或者接口

ProductBuilder.java

package com.pxx;

public interface ProductBuilder {
    //定义好产品相关的各种操作
    void buildShape();
    void buildHeight();
    void buildColor();
    Product buildProduct();
}

下面是具体的构建者对象


AoliaoConcreteBuilder.java  
package com.pxx;

public class AoliaoConcreteBuilder implements ProductBuilder {

    //这里面必须聚合一个产品类
    Product product;

    //这里面传的是一个具体的构建者对象,带着参数进来,然后赋值给一个产品
    //传进来之后再来构建相关参数
    public AoliaoConcreteBuilder(String shape,int height,String color) {
        //这里就已经赋值了
        this.product =  new Product(shape,height,color);
    }

    @Override
    public void buildShape() {
        System.out.println("奥利奥形状:" +product.getShape());
    }

    @Override
    public void buildHeight() {
        System.out.println("奥利奥高度:" + product.getHeight() + "厘米");
    }

    @Override
    public void buildColor() {
        System.out.println("奥利奥颜色:" + product.getColor());
    }

    //返回这个对象
    public Product buildProduct() {
        return product;
    }
}

Director.java

package com.pxx;

public class Director {
    //这里面我们需要调用ProductBuilder里面所有方法(这个是所有建造者的父类,也就是说,只要实现它的建造者都能传进来)
    //并且最后给我们返回一个对象
    //注意这个对象不是直接给我们运行
    //相当于是一个分发的结果
    private ProductBuilder productBuilder;//这里可以直接传入比如Aoliao这个对象,因为是实现ProductBuilder

    public Director(ProductBuilder productBuilder) {
        this.productBuilder = productBuilder;
    }

    public Product  constructProduct() {
        productBuilder.buildShape();
        productBuilder.buildHeight();
        productBuilder.buildColor();
        return productBuilder.buildProduct();
    }
}

看一下客户端Client.java

package com.pxx;

public class Client {
    public static void main(String[] args) {
        //有一个奥利奥的具体构建者对象
        AoliaoConcreteBuilder aoliao = new AoliaoConcreteBuilder("圆形",2,"蓝色");
        //利用Director来调用具体的构建者
        Director director = new Director(aoliao);//要调用这个对象的方法
        Product p = director.constructProduct();//这里就开始构建
        System.out.println(p);

    }
}

运行结果

上面就是标准建造者模式一个表示 。

上面代码还是要进行一个重构,这里我们这里是可以采用链式编程

我们需要反复拿这个建造者对象一直调用吗? 不需要,调用一下,然后返回当前调用者对象就可以了。

代码重构

ProductBuilder.java

package com.pxx;

public interface ProductBuilder {
    //定义好产品相关的各种操作
    AoliaoConcreteBuilder buildShape();
    AoliaoConcreteBuilder buildHeight();
    AoliaoConcreteBuilder buildColor();
    Product buildProduct();
}



AoliaoConcreteBuilder.java  
package com.pxx;

public class AoliaoConcreteBuilder implements ProductBuilder {

    //这里面必须聚合一个产品类
    Product product;

    //这里面传的是一个具体的构建者对象,带着参数进来,然后赋值给一个产品
    //传进来之后再来构建相关参数
    public AoliaoConcreteBuilder(String shape,int height,String color) {
        //这里就已经赋值了
        this.product =  new Product(shape,height,color);
    }

    @Override
    public AoliaoConcreteBuilder buildShape() {
        System.out.println("奥利奥形状:" +product.getShape());
        return this;
    }

    @Override
    public AoliaoConcreteBuilder buildHeight() {
        System.out.println("奥利奥高度:" + product.getHeight() + "厘米");
        return this;
    }

    @Override
    public AoliaoConcreteBuilder buildColor() {
        System.out.println("奥利奥颜色:" + product.getColor());
        return this;
    }

    //返回这个对象
    public Product buildProduct() {
        return product;
    }
}

Director.java

运行结果

其实,说一下,有时候这个建造者模式组件表现的不会那么齐全,比如我们稍微去看一下StringBuilder的源码

看到这个StringBuilder后面有个Builder就应该猜出来,它是一个建造者或者建造者的抽象层

我们可以看到StringBuilder继承了一个AbstractStringBuilder类,这个就像是具体的建造者对象去实现了建造者抽象

再去看一下AbstractStringBuilder类

那么一看这个类就是一个抽象类,这是不是就让我们想起建造者抽象,但是它还不是,我们继续往下追。

这里面就有我们常用的append抽象方法

这个就可以理解为建造者抽象,产品的话可以考虑为没有。

 而且这个里面方法都是链式编程

这个this就是一个StringBuilder的一个具体的对象。 

 好了,这个建造者模式先说到这。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java设计模式之建造者模式(Builder Pattern) 的相关文章

随机推荐

  • sas控制器驱动之设备管理

    本文以2 6 32 68内核中的mpt2sas为例子 xff0c 介绍了sas驱动的设备管理 1 基本结构 内核中scsi的结构分三层 xff0c 此在网上已有大量资料 xff0c 不再赘述 本文在此基础上增加了mid layer的 tra
  • 主成分分析、聚类分析、因子分析的基本思想及优缺点

    点击打开链接
  • pyqt5之menu和action

    exitAct 61 QAction QIcon 39 exit png 39 39 amp Exit 39 self exitAct setShortcut 39 Ctrl 43 Q 39 exitAct setStatusTip 39
  • 如何获取控件所在的坐标位置

    窗口的坐标体系及接口 获取坐标的接口在Widget类中 xff0c 即控件的坐标信息属于基类的成员 基本的坐标体系如图所示 通过接口打印出 lable 3的坐标值 print self label 3 geometry x print se
  • 【转载+修改】Gnome菜单项与文件打开方式(文件关联)的更改

    转载自 xff1a http hi baidu com red woods blog item 30a5f845a2247f24cffca397 html 转载有修改 xff01 在KDE中我们可以使用系统设置中提供的设置进行文件关联的修改
  • Kali Linux从零基础入门到精通,看完这一篇就够了。

    1 目录 基于Android设备的Kali Linux渗透测试教程基于Android设备的Kali Linux渗透测试教程2Web渗透测试使用kali linuxkali linux中文指南kali linux wireless pente
  • 客户机无法通过mstsc连接到远程主机的解决方法

    客户机无法通过 mstsc 连接到远程主机的解决方法 症状 当通过 mstsc 命令进行连接时 系统提示 客户端无法连接远程计算机 xff1b 连接可能没有启用 xff0c 或者计算机太忙 xff0c 无法接受新连接 也可能网络问题使您无法
  • 五个同步问题的经典模型之一:生产者/消费者问题

    也叫缓存绑定问题 xff08 bounded buffer xff09 xff0c 是一个经典的 多进程同步问题 单生产者和单消费者 有两个进程 xff1a 一组生产者进程和一组消费者进程共享一个初始为空 固定大小为n的缓存 xff08 缓
  • Android 以太网/有线网Ethernet功能开发

    1 功能介绍 以太网的功能是允许设备提供硬件接口通过插入网线的形式访问互联网的功能 接入网线之后 xff0c 设备可以动态的获取 IP xff0c DNS xff0c Gateway等一系列网络属性 xff0c 我们也可以手动配置设备的网络
  • 解决www.54kk.com/baidu劫持浏览器的问题

    endurer 原创 2005 10 27第一版 endurer注 xff1a 为了安全起见 xff0c 下文中的 http 均用 hxxp 代替 刚才一位同事的电脑中的浏览器被恶意网站劫持了 xff0c 请我帮忙处理 同事的电脑使用的是
  • Automatic Login

    sudo vim etc gdm custom confAdd the following lines to the field daemon AutomaticLoginEnable 61 true AutomaticLogin 61 i
  • Java Annotation手册

    版权声明 xff1a 本文可以自由转载 xff0c 转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 作者 cleverpig 作者的Blog http blog matrix org cn page cleverpig 原文 h
  • shell 函数 入参说明

    1 入参个数 2 入参 0 脚本名 1第一个参数 3 64 和 xff1a 34 64 34 34 34 都是所有入参 64 将入参变成一个数组 将入参变成一个字符串 4 数组作为入参 fucn2 arr xff0c 函数内部获取入参数组
  • 程序媛工作几年后的感受!体验?

    黑客技术 点击右侧关注 xff0c 了解黑客的世界 xff01 Java开发进阶 点击右侧关注 xff0c 掌握进阶之路 xff01 Python开发 点击右侧关注 xff0c 探讨技术话题 xff01 作者 xff1a hq nuan 来
  • TIOBE 5月编程语言榜单出炉,C#最受开发者欢迎,C++将冲击Top 3

    x1f447 x1f447 关注后回复 进群 xff0c 拉你进程序员交流群 x1f447 x1f447 TIOBE Index for May 2022 和 4 月相比 xff0c 本月编程语言 Top 10 并没有明显的位置变化 xff
  • crontab 定时任务避免重复执行

    使用crontab设置一个脚本每个一段时间自动执行一次 xff0c 当脚本的执行时间超过crontab设置的时间间隔 xff0c 那个脚本就会在同一时刻同时执行 比如设置crontab每隔五分钟执行一次task sh xff1a span
  • ubuntu 通过 apt-get 安装软件失败时的解决方案

    最近在 vmware上的ubuntu系统下安装 软件时出现安装失败情况 xff0c 在网上搜了一通 xff0c 终于找到了解决方案 遇到的问题和解决方案如下 xff1a 一 apt get install vim二 apt get upda
  • Spring注解处理机制

    前言 众所周知 xff0c spring 从 2 5 版本以后开始支持使用注解代替繁琐的 xml 配置 xff0c 到了 springboot 更是全面拥抱了注解式配置 平时在使用的时候 xff0c 点开一些常见的等注解 xff0c 会发现
  • 解决SpringBoot使用时类找不到问题

    解决方案 第一步 xff1a 勾选这个选项 第二步 xff0c 在pom xml中添加以下代码 lt resources gt lt resource gt lt directory gt src main resources lt dir
  • java设计模式之建造者模式(Builder Pattern)

    目的 xff1a 将产品与产品的创建过程解耦 他是按照相应的步骤来构建产品 下面看一下UML序列图 对于序列图的一个解释 下面来上一个标准代码 Product java package com pxx public class Produc