Java设计模式之建造者模式(Builder Pattern)
前言
这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点。
一、建造者介绍
用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象,这样就实现了的复用性和。
举例说明:
比如我们组建一个造飞船和装配飞船。
- 建造者:负责建造飞船(建造过程和细节)
- 装配者:只需要把各个零部件(引擎,轨道窗,发射塔)组装起来做成一个产品,用户只需要和装配者发生关系,获取到自己想要的产品即可。

说明:
(1)、装配者(Director)直接和客户(Client)进行交流;交流后装配者将客户创建产品的需求划分为几个部分去请求(Builder)去做,
(2)、抽象的建造者(Builder)请求委派到具体的建造者(AirBuilder);各个具体建造者负责进行产品部件的构建;最终构建成具体产品(Product)。
其实很类似苹果的代工厂
苹果公司管产品的设计,设计出来的产品,交给中国大陆的代工厂去组装生产。
二、建造者的实例讲解
下面让我们来做一个具体的实例来讲解建造者模式:
飞船实例:
假设飞船(AirShip)由三个零部件组成(引擎,轨道窗,发射塔),那么这些零部件的创建就交给我们的建造者实现,抽象的建造者(AirShipBuilder)交给具体的建造者(ZgAirShipBuilder)来完成这些零部件的生产。
具体的装配者(ZgrAirShipDirector)只需要把建造者生产出来的零部件组装起来,客户端只需要与装配者打交道即可。
具体的实现代码如下:
飞船的组装零件(Engine,EscapeTower,OrbitaModule)
public class Engine {
private String name;
public Engine(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class EscapeTower {
private String name;
public EscapeTower(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class OrbitaModule {
private String name;
public OrbitaModule(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
飞船
/**
* @author 13394
*/
public class AirShip {
private EscapeTower escapeTower;
private Engine engine;
private OrbitaModule orbitaModule;
public AirShip(EscapeTower escapeTower, Engine engine, OrbitaModule orbitaModule) {
this.escapeTower = escapeTower;
this.engine = engine;
this.orbitaModule = orbitaModule;
}
public EscapeTower getEscapeTower() {
return escapeTower;
}
public void setEscapeTower(EscapeTower escapeTower) {
this.escapeTower = escapeTower;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public OrbitaModule getOrbitaModule() {
return orbitaModule;
}
public void setOrbitaModule(OrbitaModule orbitaModule) {
this.orbitaModule = orbitaModule;
}
}
建造者 (AirShipBuilder,ZgAirShipBuilder)
public interface AirShipBuilder {
Engine getEngine();
EscapeTower getEscapeTower();
OrbitaModule getOrbitaModule();
}
public class ZgAirShipBuilder implements AirShipBuilder {
@Override
public Engine getEngine() {
System.out.println("构造发动机!!!!!!!!!!!!!");
return new Engine("发动机");
}
@Override
public EscapeTower getEscapeTower() {
System.out.println("构造逃逸塔!!!!!!!!");
return new EscapeTower("逃逸塔");
}
@Override
public OrbitaModule getOrbitaModule() {
System.out.println("构造轨道舱!!!!!!!!!!!!");
return new OrbitaModule("轨道舱");
}
}
装配者(AirShipDirector,ZgrAirShipDirector)
public interface AirShipDirector {
public AirShip directAirShip();
}
public class ZgrAirShipDirector implements AirShipDirector {
private AirShipBuilder airShipBuilder;
public ZgrAirShipDirector(AirShipBuilder airShipBuilder) {
this.airShipBuilder = airShipBuilder;
}
@Override
public AirShip directAirShip() {
Engine engine = airShipBuilder.getEngine();
EscapeTower escapeTower = airShipBuilder.getEscapeTower();
OrbitaModule orbitaModule = airShipBuilder.getOrbitaModule();
AirShip airShip = new AirShip(escapeTower, engine, orbitaModule);
return airShip;
}
}
客户端(Client)调用
public class Client {
public static void main(String[] args) {
AirShipDirector airShipDirector=new ZgrAirShipDirector(new ZgAirShipBuilder());
airShipDirector.directAirShip();
}
}
通过以上这个飞船的例子我相信大家已经明白什么是建造者模式了吧!!!!!!!!!!
三、建造者模式的应用场景
开发中应用场景:
StringBuilder类的append方法
SQL中的 PreparedStatement
JDOM中DomBuilder、SAXBuilder
四、小结
那么建造者模式有什么优点和缺点呢?
优点:
- 易于解耦
将产品本身与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。 - 易于精确控制对象的创建
将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰 - 易于拓展
增加新的具体建造者无需修改原有类库的代码,易于拓展,符合“开闭原则“。
缺点:
- 如果产品足够复杂的话,那我们的建造者创建的越多,会造成庞大的类,不利于管理。
请帮忙点个赞,因为你的鼓励是我创作最大的动力!
Java设计模式之建造者模式(Builder Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
- 二十四种设计模式:建造者模式(Builder Pattern)
建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
- 设计模式-05建造者模式(Builder Pattern)
1.模式动机 比如我们要组装一台电脑,都知道电脑是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘和鼠标组成,其中非常重要的一点就是这些硬件都是可以灵活选择,但是组装步骤都是大同小异(可以组一个 ...
- 【UE4 设计模式】建造者模式 Builder Pattern
概述 描述 建造者模式,又称生成器模式.是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
随机推荐
- Java 多线程--ThreadLocal Timer ExecutorService
ThreadLocal /** * ThreadLocal:每个线程自身的存储本地.局部区域 * @author xzlf * */ public class ThreadLocalTest01 { ...
- Exercise
""" 问:执行完下面的代码后, l,m的内容分别是什么? """ def func(m): for k,v in m.items(): m ...
- 非常简单的string驻留池,你对它真的了解吗
昨天看群里在讨论C#中的string驻留池,炒的火热,几轮下来理论一堆堆,但是在证据提供上都比较尴尬.虽然这东西很基础,但比较好的回答也不是那么容易,这篇我就以我能力范围之内跟大家分享一下 一:无处不 ...
- (三)PL/SQL数据类型
PL/SQL注释 程序注释是解释性说明,可以包括自己编写的,并帮助任何人阅读源代码的PL/SQL代码.所有的编程语言允许某种形式的注释. 在PL/SQL支持单行和多行注释.任何注释里面所有字符都会被P ...
- Windows SDK 的 ctype.h 里有一些有用的函数,例如字符串的大小写转换
#define _tolower(c) ((c) - 'A' + 'a') #define _toupper(c) ((c) - 'a' + 'A')
- 如何迅速分析出系统CPU的瓶颈在哪里?
内容出自极客时间专栏<Linux 性能优化实战> CPU 的性能指标那么多,CPU 性能分析工具一抓一大把,换成实际的工作场景,该观察什么指标.选择哪个性能工具呢? 不要担心,今天我就以多 ...
- 刚听完CSDN总裁蒋涛先生的学术报告
主题: 二十年程序人生和我的人才观 第一次参加所谓的"学术报告", 但感觉更多的是蒋总在跟我们分享他个人的成长经验. 按蒋总的话说, 他已经从2000年开始不碰怎么技术了, 所以个 ...
- 《Arduino实战》——2.4 反应速度计:谁真正拥有最快的反应时间
本节书摘来异步社区<Arduino实战>一书中的第2章,第2.4节,作者:[美]Martin Evans ,Joshua Noble ,Jordan Hochenbaum,更多章节内容可以 ...
- Spring Developer Tools 源码分析:三、重启自动配置'
接上文 Spring Developer Tools 源码分析:二.类路径监控,接下来看看前面提到的这些类是如何配置,如何启动的. spring-boot-devtools 使用了 Spring Bo ...
- 用数据说话,R语言有哪七种可视化应用?
今天,随着数据量的不断增加,数据可视化成为将数字变成可用的信息的一个重要方式.R语言提供了一系列的已有函数和可调用的库,通过建立可视化的方式进行数据的呈现.在使用技术的方式实现可视化之前,我们可以先和 ...