前言

这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点。

一、建造者介绍

​ 用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象,这样就实现了的复用性和。

举例说明:

比如我们组建一个造飞船和装配飞船。

  1. 建造者:负责建造飞船(建造过程和细节)
  2. 装配者:只需要把各个零部件(引擎,轨道窗,发射塔)组装起来做成一个产品,用户只需要和装配者发生关系,获取到自己想要的产品即可。

说明:

(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)的更多相关文章

  1. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  2. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  3. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  4. Python 设计模式之建造者模式 Builder Pattern

    #引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...

  5. 设计模式-05建造者模式(Builder Pattern)

    1.模式动机 比如我们要组装一台电脑,都知道电脑是由 CPU.主板.内存.硬盘.显卡.机箱.显示器.键盘和鼠标组成,其中非常重要的一点就是这些硬件都是可以灵活选择,但是组装步骤都是大同小异(可以组一个 ...

  6. 【UE4 设计模式】建造者模式 Builder Pattern

    概述 描述 建造者模式,又称生成器模式.是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂 ...

  7. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  8. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  9. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  10. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

随机推荐

  1. 多窗体及窗体之间传值 以及listview的使用

    三中打开窗口窗体状态: 1   messagebox.show 类型  特点: 从窗口form 1里打开另一个窗体form2,form2不关闭的情况下form1 不能操作:代码如下: private ...

  2. redis: Set集合类型(五)

    Set里面的值是不能重复的 Set设置值(头部):sadd myset hello Set获取值:smembers myset 检查Set是否包含某个元素:sismember myset hello ...

  3. web前端该怎么入门?web前端入门教程(非常详细)

    初学编程的小伙伴经常会遇到的问题,1.没资源 2.没人带 3.不知道从何开始 ,小编也是从新手期过来的,所以很能理解萌新的难处,现在整理一些以前自己学习的一些资料送给大家,希望对广大初学小伙伴有帮助! ...

  4. Java锁之自旋锁

    Java锁之自旋锁 自旋锁:spinlock,是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU 原来提到的比较并交换,底层 ...

  5. c++四舍五入函数round()

    其实c++自身是没有四舍五入函数round()的,若果你要用到的话,可以自己写一个round(),不过要用到floor()和ceil这两个函数如下: #include<iostream> ...

  6. 给动态ajax添加的元素添加click事件

    $(document).on('click','div',function(){alert(1)}); .live()方法也是可以的

  7. Python不同版本打包程序为.exe文件

    安装pyinstaller 测试用的python环境是3.6.2版本 下载地址 https://github.com/pyinstaller/pyinstaller/ 1.打开cmd,切到pyinst ...

  8. JAVA企业级应用TOMCAT实战(三)

    JVM优化涉及到两大方面我个人的理解 .如何分配JVM的内存空间 .我应该使用什么垃圾回收器 JVM产生的垃圾需要回收.回收有不同的回收器. JVM的调优需要了解各个垃圾回收机制的原理. 终极目标:降 ...

  9. 《名侦探柯南》动画登陆bilibili

    不管你看没看过.喜不喜欢,也一定听说过<名侦探柯南>这部动画,它和<火影>.<海贼王>几部动画陪伴了一代人成长的道路,而且<名侦探柯南>还是这几部动画中 ...

  10. nodejs实现定时爬取微博热搜

    The summer is coming " 我知道,那些夏天,就像青春一样回不来. - 宋冬野 青春是回不来了,倒是要准备渡过在西安的第三个夏天了. 废话 我发现,自己对 coding 这 ...