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 ...
随机推荐
- Jmeter--Plugins Manager安装及常用的插件介绍
jmeter 客户端 内置的插件管理工具Plugins Manager 1.下载地址:https://jmeter-plugins.org/install/Install/ 2.将下载的文件拷贝的你的 ...
- pysparnn 模块使用,相似句子召回
import pysparnn.cluster_index as ci from sklearn.feature_extraction.text import TfidfVectorizer data ...
- pytorch torchversion标准化数据
新旧标准差的关系
- pytorch Dataset数据集和Dataloader迭代数据集
import torch from torch.utils.data import Dataset,DataLoader class SmsDataset(Dataset): def __init__ ...
- 2019-2020-1 20199328《Linux内核原理与分析》第九周作业
笔记部分 2019/11/12 14:45:44 从CPU和内存的角度看linux系统的运行 CPU角度:首先我们进行了系统调度,然后系统进入内核态,把信息压栈,然后我们进行进程管理,由于进入系统调用 ...
- [Qt] 默认的槽函数 例如 on_pushButton_clicked()
在 setupUI 函数里有一句: QMetaObject::connectSlotsByName(QWDialog); 它假设槽函数的名称是 void on_<object name>_ ...
- JDK 15 JAVA 15的新特性展望
目录 JEP 371: Hidden Classes JEP 372: 删除 Nashorn JavaScript Engine JEP 377: 新的垃圾回收器ZGC正式上线了 JEP 378: T ...
- vue2.x学习笔记(二十八)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12682573.html. 生产环境部署 以下大多数内容在你使用vue cli的时候都是默认开启的,仅跟你自定义的构 ...
- mac OS 搭建PHP项目开发环境
系统 macOS Mojave 版本10.14.6 mac OS 自带Apache和PHP 非常便利 sudo apachectl -v //查看apache版本 php -v //查看php版本 启 ...
- Android Studio快捷键动态演示
Android Studio出来很久了,大部分已经转过来了,相对于Eclipse又是毋庸置疑,更好的使用快捷键必定达到事半功倍的效果. 友情提示:某些电脑按F1-F12键需要先按住FN,比如我的Mac ...