本文源码:GitHub·点这里 || GitEE·点这里

一、生活场景

基于建造者模式,描述软件开发的流程。

1、代码实现

/**
* 基于建造者模式描述软件开发
*/
public class C01_InScene {
public static void main(String[] args) {
BuilderSoft builderSoft = new SoftImpl () ;
ProjectManager manager = new ProjectManager(builderSoft) ;
manager.createSoft();
}
} /**
* 手机软件产品开发
*/
class MobileSoft {
// 设计
private String design ;
// 架构
private String frame ;
// 开发
private String develop ;
// 上线
private String online ;
// 省略 GET SET 方法
}
/**
* 手机软件流程抽象类
*/
abstract class BuilderSoft {
// 前期工作
public abstract void earlyWork () ;
// 中期工作
public abstract void midWork () ;
// 后期工作
public abstract void lateWork () ;
// 手机软件完成
public abstract MobileSoft builderSoft () ;
} /**
* 手机软件具体实现
*/
class SoftImpl extends BuilderSoft {
private MobileSoft mobileSoft = new MobileSoft();
@Override
public void earlyWork() {
System.out.println("软件前期设计...");
}
@Override
public void midWork() {
System.out.println("软件中期架构...");
System.out.println("软件中期开发...");
}
@Override
public void lateWork() {
System.out.println("软件后期上线...");
}
@Override
public MobileSoft builderSoft() {
return mobileSoft ;
}
}
/**
* 项目经理:把控项目进度
*/
class ProjectManager {
private BuilderSoft builderSoft ;
ProjectManager (BuilderSoft builderSoft){
this.builderSoft = builderSoft ;
}
// 统筹项目周期
public void createSoft (){
builderSoft.earlyWork();
builderSoft.midWork();
builderSoft.lateWork();
// MobileSoft mobileSoft = builderSoft.builderSoft() ;
// return mobileSoft ;
}
}

2、代码结构图

二、建造者模式

1、基础概念

建造模式是对象的创建模式。建造模式可以将一个产品的内部属性描述与产品的生产过程分割,从而可以使一个建造过程生成具有不同的内部表象的产品对象。也就是使用一个中介对象封装一系列的对象交互,使其各个对象不需要显示的相互调用,而且可以单独的改变对象之间的交互。

2、核心角色

1)、抽象建造者(Builder)角色

给出一个抽象接口,以规范产品对象的各个组成成分的建造。模式中直接创建产品对象的是具体建造者角色。

2)、具体建造者(ConcreteBuilder)角色

完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出完成创建产品实例的操作。2.在建造完成后,提供产品的实例。

3)、导演者(Director)角色

担任这个角色的类调用具体建造者角色以创建产品对象。

4)、产品(Product)角色

产品便是建造的对象。一般来说,一个系统中会有多个产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。

3、模式图解

4、源码实现

/**
* 建造者模式代码
*/
public class C02_Builder {
public static void main(String[] args) {
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
director.construct();
Product product = builder.builderProduct();
System.out.println(product.getAct1());
System.out.println(product.getAct2());
}
}
/**
* 产品类
*/
class Product {
/*定义一些产品的操作*/
private String act1;
private String act2;
public String getAct1() {
return act1;
}
public void setAct1(String act1) {
this.act1 = act1;
}
public String getAct2() {
return act2;
}
public void setAct2(String act2) {
this.act2 = act2;
}
}
/**
* Builder 抽象建造者类
*/
abstract class Builder{
public abstract void builderact1();
public abstract void builderact2();
public abstract Product builderProduct();
}
/**
* 具体建造者类
*/
class ConcreteBuilder extends Builder{
private Product product = new Product();
@Override
public void builderact1() {
product.setAct1("操作一:执行...");
}
@Override
public void builderact2() {
product.setAct2("操作二:执行...");
}
@Override
public Product builderProduct() {
return product;
}
}
/**
* Director 导演者类
*/
class Director{
/*使用建造者抽象类*/
private Builder builder;
Director(Builder builder){
this.builder = builder;
}
/*负责调用各个建造方法*/
public void construct(){
builder.builderact1();
builder.builderact2();
}
}

三、实际应用

1、JDK中应用

分析

1)、Appendable定义多个append() 抽象方法,抽象建造者。

2)、AbstractStringBuilder实现Appendable接口,已经作为了建造者,只是抽象类无法实例化。

3)、StringBuilder继承AbstractStringBuilder,即作为具体建造者,也作为指挥者。

2、Spring中应用

源码实现

// 系列方法
public BeanDefinitionBuilder setParentName(String parentName);
public BeanDefinitionBuilder setFactoryMethod(String factoryMethod);
public BeanDefinitionBuilder setFactoryMethodOnBean(String factoryMethod, String factoryBean);
public BeanDefinitionBuilder addConstructorArgValue(@Nullable Object value);
public BeanDefinitionBuilder addConstructorArgReference(String beanName);
public BeanDefinitionBuilder addPropertyValue(String name, @Nullable Object value);
// 构建Bean
public AbstractBeanDefinition getRawBeanDefinition() {
return this.beanDefinition;
}
public AbstractBeanDefinition getBeanDefinition() {
this.beanDefinition.validate();
return this.beanDefinition;
}

上面两处建造者模式的实际应用,都有点形散而神不散的感觉。

四、优缺点分析

  • 优点:减少类之间的相互依赖,降低耦合度。
  • 缺点:ConcreateBuilder变得臃肿庞大,逻辑复杂。

五、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(06):建造者模式的更多相关文章

  1. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  2. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  3. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  4. java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  5. java的23种设计模式之建造者模式

    场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...

  6. python设计模式之建造者模式

    python设计模式之建造者模式 ​ 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...

  7. 实践GoF的23种设计模式:建造者模式

    摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...

  8. C#设计模式(5)——建造者模式(Builder Pattern)

    一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...

  9. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

随机推荐

  1. 《Java基础知识》Java字符串详解

    本文内容: String类的概述 String类的使用步骤 String类的常用方法 本文目的: 能够使用String类的构造方法创建字符串对象 能够明确String类的构造方法创建对象,和直接赋值创 ...

  2. webpack构建原理和实现简单webpack

    webpack打包原理分析 基础配置,webpack会读取配置 (找到入口模块) 如:读取webpack.config.js配置文件: const path = require("path& ...

  3. C#_.NetCore_WebAPI项目_EXCEL数据导出(ExcelHelper_第二版_优化逻辑)

    项目需要引用NPOI的Nuget包:DotNetCore.NPOI-v1.2.2 本篇文章是对WebAPI项目使用NPOI操作Excel时的帮助类:ExcelHelper的改进优化做下记录: 备注:下 ...

  4. oracle中add_months()函数总结

    今天对add_months函数进行简单总结一下: add_months 函数主要是对日期函数进行操作,在数据查询的过程中进行日期的按月增加,其形式为: add_months(date,int);其中第 ...

  5. 2019年Java面试题基础系列228道(3)

    51.类 ExampleA 继承 Exception,类 ExampleB 继承ExampleA. 有如下代码片断: try { throw new ExampleB("b")}c ...

  6. vue app项目 第一天 基本架构和路由配置

    一.前言 今天开始打算花6天时间 完成一个基于vue的买菜app 在这里记录一下项目的流程和第一次做这个项目遇到的坑 以及解决的办法 二.第一步 脚手架的安装 使用npm 安装好脚手架  安装脚手架教 ...

  7. C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式

    上篇写了MFC界面搭建,这篇就写实现计算.涉及到数据结构,对新手很不友好. 虽然是MFC程序,但是能灵活地分离后台代码,自行构建控制台程序. 上篇文章链接:C++做四则运算的MFC计算器(一)MFC界 ...

  8. 爬虫(三):urllib模块

    1. urllib模块 1.1 urllib简介 urllib 是 Python3 中自带的 HTTP 请求库,无需复杂的安装过程即可正常使用,十分适合爬虫入门 urllib 中包含四个模块,分别是: ...

  9. jieba的使用

    1. 分词 分词是自然语言处理中最基础的一个步骤.而jieba分词是中文分词的一个比较好的工具.下面看看可以怎么用jieba进行分词. import jieba # 全模式 seg_list1 = j ...

  10. GO基础之异常处理

    一.异常 1. 错误指程序中出现不正常的情况,从而导致程序无法正常执行.•大多语言中使用try... catch... finally语句执行.假设我们正在尝试打开一个文件,文件系统中不存在这个文件. ...