设计模式(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 ...
随机推荐
- Linux C++ 网络编程学习系列(6)——多路IO之epoll高级用法
poll实现多路IO 源码地址:https://github.com/whuwzp/linuxc/tree/master/epoll_libevent 源码说明: server.cpp: 监听127. ...
- jpa是什么,和hibernate 有什么关系
JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中.JPA 的目标之一是制定一个可以由很多供应商实现的API,并且开发人员可以编码来实现该API,而不 ...
- 自己模拟的ftl 用法:
基类 public class Ftl_object_data_model { //三种基本属性 private boolean canRead=true;//是否能读取 ;//长度 private ...
- 自动补全、回滚!介绍一款可视化 sql 诊断利器
Yearning简介 ================= Yearning MYSQL 是一个SQL语句审核平台.提供查询审计,SQL审核等多种功能,支持Mysql,可以在一定程度上解决运维与开发之间 ...
- linux知识点系列之 umask
介绍 umask(user's mask)用来设置文件权限掩码.权限掩码是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限. UNIX最初实现时不包含umask命 ...
- Extjs简单的form+grid组合
采用的是Extjs4.2版本 http://localhost:49999/GridPanel/Index 该链接是本地连接,只是方便自己访问,读者无法正常访问. <script src=&qu ...
- NK16
C 小石的海岛之旅 链接:https://ac.nowcoder.com/acm/contest/949/C来源:牛客网 暑假到了,小石和小雨到海岛上玩. 从水平方向看海岛可以看成 nnn个小块,每一 ...
- 【原创干货】大数据Hadoop/Spark开发环境搭建
已经自学了好几个月的大数据了,第一个月里自己通过看书.看视频.网上查资料也把hadoop(1.x.2.x).spark单机.伪分布式.集群都部署了一遍,但经历短暂的兴奋后,还是觉得不得门而入. 只有深 ...
- 深入浅出node.js游戏服务器开发1——基础架构与框架介绍
2013年04月19日 14:09:37 MJiao 阅读数:4614 深入浅出node.js游戏服务器开发1——基础架构与框架介绍 游戏服务器概述 没开发过游戏的人会觉得游戏服务器是很神秘的 ...
- Python爬虫---爬取腾讯动漫全站漫画
目录 操作环境 网页分析 明确目标 提取漫画地址 提取漫画章节地址 提取漫画图片 编写代码 导入需要的模块 获取漫画地址 提取漫画的内容页 提取章节名 获取漫画源网页代码 下载漫画图片 下载结果 完整 ...