设计模式(Java语言)- 建造者模式
前言
在日常的生活中,我们可以经常看到建造者模式的影子。比如,建造房子,那么房子就是一个产品,房子由门,窗,墙,地板等部门组成。然后包工头在建造房子的时候就根据设计好的图纸来建造,但是包工头并不是亲自来建造房子的,而是通过指挥工人来施工。再比如组装电脑,可以根据不同的厂商来组装成不同类型的包括cpu,gpu等都不一样的电脑。
建造者模式定义
建造者模式,也称之为创建者模式,将一个复杂的对象的构建和它的表示分离,使得同样的构建过程可以创建出不同的表示,这样的设计模式称之为建造者模式。建造者模式将一个复杂的对象分解成多个简单的对象,然后利用简单的对象一步步构建出复杂的对象。它是变与不变相互分离,即一个产品的组成部分是相同的,但是每个部分产品确实可以依据具体情况来灵活选择。
建造者模式的应用场景
需要生成的产品对象具有复杂的内部结构,隔离产品构建和表示,比如:
1、Java中的java.lang.StringBuilder、java.lang.StringBuffer类使用到了建造者模式。
2、mybatis 中的SqlSessionFactoryBuilder使用到了建造者模式。
建造者模式的角色
1、产品(product):被创建的复杂对象,内部具有多个属性等,由具体的建造者来构建。比如电脑,房子等都是产品角色。
2、抽象建造者(abstract builder): 抽象建造者是对产品构建过程的规范,比如建造房子需要哪些步骤才可以。类似于房子的设计图纸,所有的房子都是按照图纸建造出来的。
3、具体建造者(concrete builder):具体建造者构建产品过程中每个步骤的具体体现。比如建造房子是需要地板,那么这个地板是用木板还是瓷砖来做的,都是由具体建造者角色来决定的。
4、指挥者(director):指挥者就是根据具体建造者的步骤,依据不同的顺序来构建出具体的产品。比如每个包工头建造的房子的顺序都不一样,有的可以要先砌好墙,然后再砌地板,但是无论顺序怎么样,最终造出来的房子是一样的。
建造者模式UML类图

代码实现
首先,我先用上面组装电脑的例子用代码实现一下。
第一步,创建产品:computer
/**
* @InterfaceName: Computer
* @description:
* @author: rainple
* @create: 2020-05-07 12:42
**/
public class Computer { private String gpu;
private String cpu;
private String ram;
private String mainboard;
private String power; public String getGpu() {
return gpu;
} public void setGpu(String gpu) {
this.gpu = gpu;
} public String getCpu() {
return cpu;
} public void setCpu(String cpu) {
this.cpu = cpu;
} public String getRam() {
return ram;
} public void setRam(String ram) {
this.ram = ram;
} public String getMainboard() {
return mainboard;
} public void setMainboard(String mainboard) {
this.mainboard = mainboard;
} public String getPower() {
return power;
} public void setPower(String power) {
this.power = power;
} @Override
public String toString() {
return "Computer{" +
"gpu='" + gpu + '\'' +
", cpu='" + cpu + '\'' +
", ram='" + ram + '\'' +
", mainboard='" + mainboard + '\'' +
", power='" + power + '\'' +
'}';
}
}
生成抽象Builder类
/**
* @className: Builder
* @description:
* @author: rainple
* @create: 2020-05-07 12:45
**/
public abstract class Builder { /**
* 组装显卡
*/
abstract void buildGpu(); /**
* 组装cpu
*/
abstract void buildCpu(); /**
* 组装内存
*/
abstract void buildRam(); /**
* 组装主板
*/
abstract void buildMainboard(); /**
* 组装电源
*/
abstract void buildPower(); /**
* 获取电脑
* @return
*/
abstract Computer getComputer(); }
创建一个mac电脑
/**
* @className: MacComputer
* @description:
* @author: rainple
* @create: 2020-05-07 12:47
**/
public class MacComputerBuilder extends Builder { private Computer computer; public MacComputerBuilder() {
computer = new Computer();
} @Override
void buildGpu() {
computer.setGpu("atx");
System.out.println("mac book is building gpu");
} @Override
void buildCpu() {
computer.setCpu("intel i7");
System.out.println("mac book is building cpu");
} @Override
void buildRam() {
computer.setRam("三星");
System.out.println("mac book is building ram");
} @Override
void buildMainboard() {
computer.setMainboard("microStar");
System.out.println("mac book is building main board");
} @Override
void buildPower() {
computer.setPower("战斧");
System.out.println("mac book is building power");
} @Override
Computer getComputer() {
return computer;
}
}
指挥者
/**
* @className: Derector
* @description:
* @author: rainple
* @create: 2020-05-07 12:52
**/
public class Director { private Builder builder; public Director(Builder builder) {
this.builder = builder;
} public void setBuilder(Builder builder) {
this.builder = builder;
} /**
* 组装电脑,组装的顺序可以不同,但是最终组装出来的电脑是一致的
* @return
*/
public Computer build() {
builder.buildGpu();
builder.buildCpu();
builder.buildMainboard();
builder.buildPower();
builder.buildRam();
return builder.getComputer();
}
}
测试
/**
* @className: Client
* @description:
* @author: rainple
* @create: 2020-05-07 12:54
**/
public class Client { public static void main(String[] args) {
Builder builder = new MacComputerBuilder();
Director director = new Director(builder);
Computer build = director.build();
System.out.println(build);
} }
//mac book is building gpu
//mac book is building cpu
//mac book is building main board
//mac book is building power
//mac book is building ram
//Computer{gpu='atx', cpu='intel i7', ram='三星', mainboard='microStar', power='战斧'}
当我们在需要创建其它品牌的电脑时,我们只需要集成Builder即可,
/**
* @className: HuaweiComputer
* @description:
* @author: rainple
* @create: 2020-05-08 12:42
**/
public class HuaweiComputerBuilder extends Builder { private Computer computer; public HuaweiComputerBuilder() {
computer = new Computer();
} @Override
void buildGpu() {
computer.setGpu("显卡");
} @Override
void buildCpu() {
computer.setCpu("cpu");
} @Override
void buildRam() {
computer.setRam("内存");
} @Override
void buildMainboard() {
computer.setMainboard("主板");
} @Override
void buildPower() {
computer.setPower("电源");
} @Override
Computer getComputer() {
return computer;
}
}
测试
/**
* @className: Client
* @description:
* @author: rainple
* @create: 2020-05-07 12:54
**/
public class Client { public static void main(String[] args) {
Builder builder = new MacComputerBuilder();
Director director = new Director(builder);
Computer build = director.build();
System.out.println(build);
director.setBuilder(new HuaweiComputerBuilder());
build = director.build();
System.out.println(build);
} }
结果:
mac book is building gpu
mac book is building cpu
mac book is building main board
mac book is building power
mac book is building ram
Computer{gpu='atx', cpu='intel i7', ram='三星', mainboard='microStar', power='战斧'}
Computer{gpu='显卡', cpu='cpu', ram='内存', mainboard='主板', power='电源'}
建造者模式的优缺点
优点:
1、可以分步构建复杂的对象
2、能够解决复杂对象内部结构频繁的需求变动的问题
3、用户新增不同产品时,只需要新增具体的构建者即可,不需要修改原有的产品的构建流程
缺点:
1、建造者模式不适用与存有较大差异的产品对象
2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大
设计模式(Java语言)- 建造者模式的更多相关文章
- java23种设计模式——五、建造者模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- java 之 建造者模式(大话设计模式)
建造者模式,在笔者看来比较试用于,定制一个业务流程,而流程的细节又不尽相同,每个细节又必不可少,这时应考虑使用建造者模式. 大话设计模式-类图 先看下笔者写的一个简单的例子. /** * 所有建造过程 ...
- java常用设计模式五:建造者模式
1.定义 是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 产品类:一般是一个较为复杂的对象,也就是说创建对象的 ...
- Java设计模式学习记录-建造者模式
前言 今天周末,有小雨,正好也不用出门了,那就在家学习吧,经过了两周的面试,拿到了几个offer,但是都不是自己很想去的那种,要么就是几个人的初创小公司,要么就是开发企业内部系统的这种传统开发,感觉这 ...
- java设计模式-----6、建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类 ...
- Java学习笔记——设计模式之九.建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Product类: package cn.happy.design_pattern._09b ...
- Java设计模式14:建造者模式
什么是建造者模式 发现很多框架的源码使用了建造者模式,看了一下觉得挺实用的,就写篇文章学习一下,顺便分享给大家. 建造者模式是什么呢?用一句话概括就是建造者模式的目的是为了分离对象的属性与创建过程,是 ...
- Java设计模式之(建造者模式)
建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式通常包括下面几个角色: 1. builder:抽象建造者,给出一个抽象接口,以规范产品对象的各个组 ...
- JAVA设计模式之【建造者模式】
建造者模式 建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品 角色 Builder抽象建造者 buildPartX getResult ConcreteBuilder具体建 ...
- Java描述设计模式(06):建造者模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 基于建造者模式,描述软件开发的流程. 1.代码实现 /** * 基于建造者模式描述软件开发 */ public class C0 ...
随机推荐
- PHP 5.6连接MySQL 8.0版本遇到的坑
一.数据库失败Warning: mysqli_connect(): The server requested authentication method unknown to t... <?ph ...
- C语言小练习之学生信息管理系统
C语言小练习之学生信息管理系统 main.c文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...
- php.ini中文详解
[PHP] ;;;;;;;;;;;;;;;;;;;;;;; ; 关于 php.ini 配置文件 ; ;;;;;;;;;;;;;;;;;;;;;;; ; PHP 的初始化文件, 必须命名为 php.in ...
- windows编译动态链接库,dll+lib的形式
之前一直在linux上做开发,没怎么关注过windows上如何编译动态链接库.不过一直存疑,为什么windows上的动态链接库是.dll配合.lib使用的,这个又是怎么生成的呢,通过一段时间的查资料和 ...
- [V&N2020 公开赛]TimeTravel 复现
大佬友链(狗头):https://www.cnblogs.com/p201821440039/ 参考博客: https://www.zhaoj.in/read-6407.html https://cj ...
- C#获取文件夹内文件包括子文件(递归)实例
这个在我工作上,写了一次工具项目,用上的. static ArrayList FileList = new ArrayList();//这个必须写在方法外, static ArrayList GetA ...
- cgi、fastCGI、php-fpm、 php-CGI的区别
cgi.fastCGI.php-fpm. php-CGI的区别 作为面试的高频热点问题,必须来一波记录: 我们发送一个请求到收到响应之间的一个过程是什么? 如果客户端请求的是 index.html,那 ...
- 杂园日记-获取URL参数
function getUrlParams(name, url){ var locationUrl = window.location.search; if(url){ var s =url.inde ...
- 易学又实用的新特性:for...of
今天带来的知识点既简单又使用,是不是感觉非常的棒啊,OK,不多说了,咱们开始往下看. for...of 是什么 for...of 一种用于遍历数据结构的方法.它可遍历的对象包括数组,对象,字符串,se ...
- Spring5参考指南:组件扫描
文章目录 组件扫描 @Component 元注解和组合注解 组件内部定义Bean元数据 为自动检测组件命名 为自动检测的组件提供作用域 生成候选组件的索引 组件扫描 上一篇文章我们讲到了annotat ...