本文源码: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. C#通过WMI获取硬件信息

    有时候需要得到硬件信息绑定用户登录 代码如下: private string GetProcessSerialNumber() { try { ManagementObjectCollection P ...

  2. (Concurrent)HashMap的存储过程及原理。

    1.前言 看完咕泡Jack前辈的有关hashMap的视频(非宣传,jack自带1.5倍嘴速,高效),收益良多,所以记录一下学习到的东西. 2.基础用法 源码的注释首先就介绍了哈希表是基于Map接口,所 ...

  3. 在 Spring Boot 项目中使用 activiti

    新建springBoot项目时勾选activiti,或者在已建立的springBoot项目添加以下依赖: <dependency> <groupId>org.activiti& ...

  4. iOS开发之微信第三方登录

    参考链接:https://blog.csdn.net/lichuandev/article/details/79878730 参考链接:https://www.jianshu.com/p/59e2ac ...

  5. 又到了抵制Notepad++的时候了?

    逛开源中国(OSCHINA),无意中发现一贴<不用Notepad++,你还有这些更好的选择> 才发现,原来 Notepad++ 的作者侯今吾前几天又在 npp 的官网上发表了一篇个人政治意 ...

  6. IM即时通信软件设计

    参考资料: 架构篇:https://yq.aliyun.com/articles/698301 模型篇:https://yq.aliyun.com/articles/701593 实现篇:https: ...

  7. mac-安装sshpass

    在配置了ssh免密认证id_rsa.pub之后,在cmd终端可以实现免密登陆对应配置了密钥的服务器,但是在python程序中,想要调用cmd执行免密操作,还需要安装sshpass,sshpass用于非 ...

  8. UWP 使用FontIcon

    通常在设置按钮内容的时候,我们一般会写上文字,比如 <Button Content="OK"/> 但是有一些特殊情况,比如我们的按钮需要一个图标, 这个时候就需要一些特 ...

  9. [WPF 自定义控件]自定义控件库系列文章

    Kino.Toolkit.Wpf Kino.Toolkit.Wpf是一组简单实用的WPF控件与工具,用于介绍自定义控件的入门.相关博客地址如下: 开始一个自定义控件库项目 介绍开始一个自定义控件库项目 ...

  10. Java每日一面(Part1:计算机网络)[19/11/13]

    作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1. HTTP相关[1] 1.1 HTTP简介 ​ HTTP协议,即超文本传输协议,属于应用层的协议,他是基于请求和响应模式的无状态的 应用层协议. ...