设计模式(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 ...
随机推荐
- CKEDITOR (FCKEDITOR) --- 目前最优秀的可见即可得网页编辑器之一
FCKEDITOR 编辑 同义词 CKEditor一般指FCKEDITOR FCKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScript编写.具备功能强大.配置容易.跨浏览器. ...
- 数据结构和算法(Golang实现)(8.2)基础知识-分治法和递归
分治法和递归 在计算机科学中,分治法是一种很重要的算法. 字面上的解释是分而治之,就是把一个复杂的问题分成两个或更多的相同或相似的子问题. 直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合 ...
- 数据结构和算法(Golang实现)(26)查找算法-哈希表
哈希表:散列查找 一.线性查找 我们要通过一个键key来查找相应的值value.有一种最简单的方式,就是将键值对存放在链表里,然后遍历链表来查找是否存在key,存在则更新键对应的值,不存在则将键值对链 ...
- Fiddler 内置命令与断点
Fiddler还有一个藏的很深的命令框,就是眼前,我用了几年的Fiddler都没有发现它,偶尔在别人的文章发现还有这个小功能,还蛮好用的,整理下记录在这里. FIddler断点功能就是将请求截获下来, ...
- AJ学IOS(52)多线程网络之GCD下单例设计模式
AJ分享,必须精品 单例模式 1:单例模式的作用 可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问 从而方便地控制了实例个数,并节约系统资源 单例模式的使用场合 在整个应用程序中, ...
- AJ学IOS(31)UI之Quartz2D图形上下文栈
AJ分享,必须精品 首先,前面博客说过.qurza2d的上下文中有绘图信息和绘图的属性. 但是他是怎么绘制到上下午中的呢? 我们画图时候一半会用这三个步骤: (1)获取上下文 (2)绘图 (3)渲染 ...
- Opencv for android 模板匹配
因为有这方面的需要所以,对模板查找搜寻了相关资料,只是对于算法的东西很难看得动,特别是opencv涉及的很多的数学方法. 所以只为了实现这个功能,因为需求比较简单,在网上也搜寻到了相关代码,就直接拿来 ...
- 基于 HTML5 WebGL 的 CPU 监控系统
前言 科技改变生活,科技的发展带来了生活方式的巨大改变.随着通信技术的不断演进,5G 技术应运而生,随时随地万物互联的时代已经来临.5G 技术不仅带来了更快的连接速度和前所未有的用户体验,也为制造业, ...
- 核心task
由于Ant具有跨平台的特性,因此编写Ant生成文件时可能会失去一些灵活性.为了弥补这个不足,Ant提供了一个“exec”核心task,允许执行特定操作系统上的命令.
- 关于树的重心--POJ 1655
树的重心的定义: 在一棵树中,找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 通俗来说就是以这个点为根节点,找到他最大的衣蛾子树,然后 ...