Java描述设计模式(06):建造者模式
本文源码: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):建造者模式的更多相关文章
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
- java设计模式3——建造者模式
java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...
- java的23种设计模式之建造者模式
场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...
- python设计模式之建造者模式
python设计模式之建造者模式 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...
- 实践GoF的23种设计模式:建造者模式
摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...
- C#设计模式(5)——建造者模式(Builder Pattern)
一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...
- 【GOF23设计模式】建造者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...
随机推荐
- C语言中表达n次方
C语言中表达n次方可以用pow函数. 函数原型:double pow(double x, double y) 功 能:计算x^y的值 返 回 值:计算结果 举例: double a; a = p ...
- ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study (线段树)
Ryuji is not a good student, and he doesn't want to study. But there are n books he should learn, ea ...
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 D 80 Days (线段树查询最小值)
题目4 : 80 Days 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 80 Days is an interesting game based on Jules Ve ...
- d3.js 教程 模仿echarts折线图
今天我们来仿echarts折线图,这个图在echarts是折线图堆叠,但是我用d3改造成了普通的折线图,只为了大家学习(其实在简单的写一个布局就可以).废话不多说商行代码. 1 制作 Line 类 c ...
- JVM CPU Profiler技术原理及源码深度解析
研发人员在遇到线上报警或需要优化系统性能时,常常需要分析程序运行行为和性能瓶颈.Profiling技术是一种在应用运行时收集程序相关信息的动态分析手段,常用的JVM Profiler可以从多个方面对程 ...
- Vue.js实现大文件分片md5断点续传
背景 根据部门的业务需求,需要在网络状态不良的情况下上传很大的文件(1G+).其中会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长,请求超时:3,传输中断,必须重新上传导致前功尽 ...
- 携程PMO--扑克派对,我的估算我做主!
转自本人运营的公众号“ 携程技术中心PMO”(ID:cso_pmo) 作者简介 Ollie Guan,携程PMO高级项目集经理,负责敏捷总动员及携程技术中心PMO微信公众号运营.上海AUG ...
- 如何减小ABAP业务代码的复杂度
在程序开发的过程中,相同的功能往往有不同的实现方式.对于可以实现同样功能的不同代码,复杂度是用于比较其质量优劣的重要指标. 在本文中,代码复杂度是指代码被理解/修改的难易程度.越容易被理解.修改的代码 ...
- Cortex-A7处理器算数运算指令和逻辑运算指令
汇编中也可以进行算术运算, 比如加减乘除,常用的运算指令用法如表所示: 常用运算指令 在嵌入式开发中最常会用的就是加减指令,乘除基本用不到. 我们用 C 语言进行CPU 寄存器配置的时候常常需要用 ...
- React: 高阶组件(HOC)
一.简介 如我们所知,JavaScript有高阶函数这么一个概念,高阶函数本身是一个函数,它会接收或者返回一个函数,进而对该函数进行操作.其实,在React中同样地有高阶组件这么一个东西,称为HOC, ...