构建者模式(Builder pattern)

构建者模式应用场景:

主要用来构建一些复杂对象,这里的复杂对象比如说:在建造大楼时,需要先打牢地基,搭建框架,然后自下向上地一层一层盖起来。通常,在建造这种复杂结构的物体时,很难一气呵成。我们需要首先建造这个物体的各个部分,然后分阶段将他们组合起来。那么现在就出现了构建者模式:构建者模式由Builder(建造者)和Director(指挥者)组成。请看如下的UML图:

Director类package com.yuan.builder.demo1;//指挥:核心,负责指挥构建一个工程,工程如何构建,由它决定public class Director {    //指挥工人给出执行顺序    public Product build(Builder builder) {        builder.buildA();        builder.buildC();        builder.buildD();        builder.buildB();        return builder.getProduct();    }}

Builder类

package com.yuan.builder.demo1;//抽象的建造者public abstract class Builder {    abstract  void buildA();//地基    abstract  void buildB();//钢筋工程    abstract  void buildC();//铺电线    abstract  void buildD();//粉刷    //完工:得到了具体的产品    abstract  Product getProduct();}Worker类
package com.yuan.builder.demo1;/** * 具体的建造者:工人 */public class Worker extends Builder  {    private Product product;    public Worker() {        this.product = new Product();    }    @Override    void buildA() {        product.setBuildA("地基");        System.out.println("地基");    }    @Override    void buildB() {        product.setBuildB("钢筋工程");        System.out.println("钢筋工程");    }    @Override    void buildC() {        product.setBuildC("铺电线");        System.out.println("铺电线");    }    @Override    void buildD() {        product.setBuildD("粉刷");        System.out.println("粉刷");    }    @Override    Product getProduct() {        return product;    }}Product类
package com.yuan.builder.demo1;//产品:房子public class Product {    private String buildA;    private String buildB;    private String buildC;    private String buildD;    public String getBuildA() {        return buildA;    }    public void setBuildA(String buildA) {        this.buildA = buildA;    }    public String getBuildB() {        return buildB;    }    public void setBuildB(String buildB) {        this.buildB = buildB;    }    public String getBuildC() {        return buildC;    }    public void setBuildC(String buildC) {        this.buildC = buildC;    }    public String getBuildD() {        return buildD;    }    public void setBuildD(String buildD) {        this.buildD = buildD;    }    @Override    public String toString() {        return "Product{" +                "buildA='" + buildA + '\'' +                ", buildB='" + buildB + '\'' +                ", buildC='" + buildC + '\'' +                ", buildD='" + buildD + '\'' +                '}';    }}
Test类
package com.yuan.builder.demo1;public class Test {    public static void main(String[] args) {        //指挥        Director director = new Director();        //指挥具体的工人完成        Product product = director.build(new Worker());        System.out.println(product.toString());    }}

拓展思路:

谁知道什么:在面向对象编程中,”谁知道什么”是非常重要的。也就是说,我们需要在编程时注意哪个类可以适用哪些方法以及使用哪个方法到底好不好。

设计时能够决定的事情和不能决定的事情:Builder类中的抽象方法的定义!!!

Original: https://www.cnblogs.com/lekuyuan/p/13944326.html
Author: 乐酷yuan
Title: 构建者模式(Builder pattern)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593709/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 哈工大软件构造复习——LSP原则,协变和逆变

    (防扒链接) 何以牵尘的博客_CSDN博客https://blog.csdn.net/m0_61753302 ;何以牵尘 – 博客园 (cnblogs.com)http…

    Java 2023年6月9日
    0106
  • Spring Boot 使用 Log4j2

    Java 中比较常用的日志工具类,有 Log4j、SLF4j、Commons-logging(简称jcl)、Logback、Log4j2(Log4j 升级版)、Jdk Loggin…

    Java 2023年5月30日
    088
  • Nginx+php+mysql+wordpress搭建自己的博客站点

    服务器环境要求Centos 6 或以上版本(由于我们的目标是半小时内搭建好,那就选简单yum安装)MySQL 5或更新版本Nginx 1或更新版本PHP 5 或更新版本 php-f…

    Java 2023年6月8日
    0178
  • 期末求加分

    信2005-3班 20203910 陈振辉 和王建民老师度过了一个愉快的学期,期末希望成绩能加分,申请理由如下: 1.在第一次课上动手又动脑中,第一阶段班级达到前15名提交要求。 …

    Java 2023年6月9日
    069
  • Spring基于注解的AOP的切面优先级

    每一个切面都有一个默认的优先级(默认值为Integer的最大值) @Order(1)通过这个注解设置一个正整数数值,数值越小,优先级越高 @Component @Aspect//&…

    Java 2023年6月16日
    082
  • slf4j、log4j2及logback使用

    slf4j、log4j2及logback使用 1、问题来源 之前看过关于slf4j、log4j2及logback的介绍,slf4j是门面,log4j2及logback是具体实现,仅…

    Java 2023年6月15日
    0109
  • java学习之spring基础

    spring框架应用的是ioc模式,ioc模式是指控制反转模式,本质是你不去创建对象让spring框架给你创建对象你去使用对象。多种开发模式通过配置文件和注解的方式去开发的都很值得…

    Java 2023年6月13日
    096
  • 为什么要在resources下面的META-INF中配置spring.factories

    因为如果是公共的模块(base-common)里面的一些配置,比如对数据源的配置,虽然别的服务模块依赖公共模块,但是在别的服务启动的时候并不会扫描到base-common下的组件。…

    Java 2023年5月30日
    083
  • java程序猿如何练习java版的易筋经?

    故事背景 电视剧《天龙八部》中,阿朱易容后进入少林寺偷走了《易筋经》,她一直想把这本书送给乔峰。耿直的乔峰觉得此书来历不正,不肯接受。几番波折,这本书最后落到聚贤庄庄主游坦之手里。…

    Java 2023年5月29日
    075
  • 设计模式 11 外观模式

    外观模式(Facade Pattern)属于 结构型模式 在生活中,经常遇到这样的情况:办理一个业务,需要找很多部门签字盖章,这些部门往往距离较远,无奈只得四处奔波。这时候相信所有…

    Java 2023年6月6日
    097
  • java——封装

    public void setXxx(类型 参数名){ public XX getXxx(){ public Person(String name,int age,double s…

    Java 2023年6月5日
    088
  • 项目十大管理(五)质量管理

    首先来看看关于质量的定义: 反应实体满足主体明确和隐含需求的能力的特性总和(ISO) 一组固有特性满足要求的程度(GB/T19000-2008) 质量是对一个产品(或服务)满足程度…

    Java 2023年6月6日
    070
  • 5分钟了解Redis的内部实现快速列表(quicklist)

    在Redis3 .2版本之前,存储列表(list)数据结构使用的是压缩列表(ziplist)和链表(linkedlist),当列表元素个数比较少并且每个元素占用空间比较小的时候,使…

    Java 2023年6月7日
    089
  • Java内部类初探

    Java内部类初探 之前对内部类的概念不太清晰,在此对内部类与外部类之间的关系以及它们之间的调用方式进行一个总结。 Java内部类一般可以分为以下三种: 成员内部类 静态内部类 匿…

    Java 2023年6月8日
    085
  • 线程从2022-06-23 18.21 等待到2022-06-24 11:00

    "task-scheduler-4" #412 prio=5 os_prio=0 tid=0x00007fc5c0017800 nid=0x55d4 in Ob…

    Java 2023年6月9日
    096
  • Mybatis-plus的自定义分页搭配sql Server数据库使用

    原文出处:mybatisplus查询分页并且排序报错解决方法,适用于自定义sql和sqlserver_十七梦的博客-CSDN博客 一开始使用过的是官方文档来写分页,结果出现了如果不…

    Java 2023年6月6日
    0101
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球