浅谈GOF设计模式之建造者模式(五)

  • 建造者模式的本质
  • 代码实现
    • 代码逻辑分块
    • 传统实现方式
    • GOF实现方式
    • 变种
  • 使用场景

建造者模式的本质

一般与工厂模式搭配使用
1.分离了对象子组件的单独构造(有bulider来负责)和装配(由Director负责)。从而可以构造出复杂的对象:某个对象构建相对复杂的情况下使用。
2.由于实现了构建和装配的解耦。不同的的解耦器,相同的装配,也可以做出不同的对象;
相同的构造器,不同的装配顺序也可以做出不同的对象。也就实现了
构建算法、装配算法的解耦,实现了更好的复用。

代码实现

代码逻辑分块

1.产品类-(组件类)
2.建造者(创建一个产品对象的各个部件的抽象接口) 具体建造者(实现建造者接口,构建和装配各个部件)
3.指挥者类(构建一个使用建造者接口的对象,调用创建类,创建组件,按照不同的顺序组装成不同的产品)

传统实现方式

产品类

package com.bjsxt.builder.ji;/*** @Author JJL* @Date 2020/9/11 14:48* @Version 1.0*/
//飞船类 -- 产品类
public class JiShip {private OrbitalModule orbitalModule;  //轨道舱private Engine engine; //发动机private EscapeTower escapeTower;  //逃逸塔public void launch(){System.out.println("老子要发射!");}public OrbitalModule getOrbitalModule() {return orbitalModule;}public void setOrbitalModule(OrbitalModule orbitalModule) {this.orbitalModule = orbitalModule;}public Engine getEngine() {return engine;}public void setEngine(Engine engine) {this.engine = engine;}public EscapeTower getEscapeTower() {return escapeTower;}public void setEscapeTower(EscapeTower escapeTower) {this.escapeTower = escapeTower;}}//轨道舱
class OrbitalModule{private String name;public OrbitalModule(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}//发动机
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;}}//逃逸仓
class EscapeTower{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public EscapeTower(String name) {super();this.name = name;}}

建造者

package com.bjsxt.builder.ji;import com.bjsxt.builder.ji.Engine;
import com.bjsxt.builder.ji.EscapeTower;
import com.bjsxt.builder.ji.OrbitalModule;/*** @Author JJL* @Date 2020/9/11 14:48* @Version 1.0*/
public interface IJiShipBuilder {/*** BuildPart* @return*/Engine builderEngine();OrbitalModule builderOrbitalModule();EscapeTower builderEscapeTower();/*** getResult* @return*/JiShip buildShip();
}package com.bjsxt.builder.ji;/*** @Author JJL* @Date 2020/9/11 15:14* @Version 1.0*/
public class ConJiShipBudiler implements IJiShipBuilder{private JiShip jiShip = null;private Engine engine = null;private EscapeTower escapeTower = null;private OrbitalModule orbitalModule = null;/*** 构造器 -- 这里进行取值*/public ConJiShipBudiler() {if(jiShip == null){jiShip = new JiShip();}}/*** buildPart* @return*/@Overridepublic Engine builderEngine() {engine = new Engine("老子的发动机");return engine;}/*** buildPart* @return*/@Overridepublic OrbitalModule builderOrbitalModule() {orbitalModule = new OrbitalModule("老子的轨道舱");return orbitalModule;}/*** buildPart* @return*/@Overridepublic EscapeTower builderEscapeTower() {escapeTower = new EscapeTower("老子的逃逸塔");return escapeTower;}/*** getResult -- 建造者 -- 组装过程* @return*/@Overridepublic JiShip buildShip() {jiShip.setEngine(engine);jiShip.setEscapeTower(escapeTower);jiShip.setOrbitalModule(orbitalModule);return jiShip;}
}

指挥者

package com.bjsxt.builder.ji;/*** @Author JJL* @Date 2020/9/11 16:01* @Version 1.0*/
public class Director {/*** 用来指挥建造过程*/public JiShip Construct(IJiShipBuilder builder) {builder.builderEngine();builder.builderEscapeTower();builder.builderOrbitalModule();return builder.buildShip();}
}

调用者

package com.bjsxt.builder.ji;/*** @Author JJL* @Date 2020/9/11 19:39* @Version 1.0*/
public class Cilent {public static void main(String[] args) {Director director = new Director();JiShip jiShip = director.Construct(new ConJiShipBudiler());System.out.println(jiShip.getEngine().getName() + "" + jiShip.getEscapeTower().getName() + jiShip.getOrbitalModule().getName());jiShip.launch();}
}

GOF实现方式

产品以及产品组件


//飞船类
public class AirShip {private OrbitalModule orbitalModule;  //轨道舱private Engine engine; //发动机private EscapeTower escapeTower;  //逃逸塔public void launch(){System.out.println("发射!");}public OrbitalModule getOrbitalModule() {return orbitalModule;}public void setOrbitalModule(OrbitalModule orbitalModule) {this.orbitalModule = orbitalModule;}public Engine getEngine() {return engine;}public void setEngine(Engine engine) {this.engine = engine;}public EscapeTower getEscapeTower() {return escapeTower;}public void setEscapeTower(EscapeTower escapeTower) {this.escapeTower = escapeTower;}}//轨道舱
class OrbitalModule{private String name;public OrbitalModule(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}//发动机
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;}}//逃逸仓
class EscapeTower{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public EscapeTower(String name) {super();this.name = name;}}

建造者 具体建造者 块

public interface AirShipBuilder {Engine builderEngine();OrbitalModule builderOrbitalModule();EscapeTower  builderEscapeTower();
}//构建者--创建具体的产品组件
public class SxtAirShipBuilder implements AirShipBuilder {//StringBuilder, 以后学习XML解析中,JDOM库中的类:DomBuilder,SaxBuilder/*** 创建方法的返回实例可以跟单例模式和工厂模式结合起来* @return*/@Overridepublic Engine builderEngine() {System.out.println("构建尚学堂牌发动机!");return new Engine("尚学堂牌发动机!");}@Overridepublic EscapeTower builderEscapeTower() {System.out.println("构建逃逸塔");return new EscapeTower("尚学堂牌逃逸塔");}@Overridepublic OrbitalModule builderOrbitalModule() {System.out.println("构建轨道舱");return new OrbitalModule("尚学堂牌轨道舱");}   }

指挥者块

//装配者(装配组件返回产品)
public interface AirShipDirector {/*** 组装飞船对象* @return*/AirShip   directAirShip();}/*** 装配者,将构建者传进来之后,按照顺序等(装配过程)装配成具体的产品  -- 组装*/
public class SxtAirshipDirector implements AirShipDirector {private AirShipBuilder builder;public SxtAirshipDirector(AirShipBuilder builder) {this.builder = builder;}@Overridepublic AirShip directAirShip() {Engine e = builder.builderEngine();OrbitalModule o = builder.builderOrbitalModule();EscapeTower et = builder.builderEscapeTower();//装配成飞船对象AirShip ship = new AirShip();ship.setEngine(e);ship.setEscapeTower(et);ship.setOrbitalModule(o);return ship;}}

调用块

public class Client {public static void main(String[] args) {AirShipDirector director = new SxtAirshipDirector(new SxtAirShipBuilder());AirShip ship = director.directAirShip();System.out.println(ship.getEngine().getName());ship.launch();}
}

变种

具体建造者

public class ExtendByJiShipBuilder implements AirShipBuilder{@Overridepublic Engine builderEngine() {System.out.println("构建发动机X2");return new Engine("X2");}@Overridepublic OrbitalModule builderOrbitalModule() {System.out.println("构建轨道舱X2");return new OrbitalModule("X2");}@Overridepublic EscapeTower builderEscapeTower() {System.out.println("构建逃逸塔X2");return new EscapeTower("X2");}
}

指挥者类

public class ExtendByJiShipDirector implements AirShipDirector{private AirShipBuilder builder;public void setBuilder(AirShipBuilder b){this.builder = b;}@Overridepublic AirShip directAirShip() {AirShip ship = new AirShip();ship.setEngine(builder.builderEngine());ship.setEscapeTower(builder.builderEscapeTower());ship.setOrbitalModule(builder.builderOrbitalModule());return ship;}
}

调用者

public class Client {public static void main(String[] args) {AirShipDirector director = new SxtAirshipDirector(new SxtAirShipBuilder());AirShip ship = director.directAirShip();System.out.println(ship.getEngine().getName());ship.launch();//变种ExtendByJiShipDirector extendByJiShipDirector = new ExtendByJiShipDirector();ExtendByJiShipBuilder builder = new ExtendByJiShipBuilder();extendByJiShipDirector.setBuilder(builder);AirShip eShip = extendByJiShipDirector.directAirShip();System.out.println(eShip.getEngine().getName());eShip.launch();}
}

使用场景

1.StringBuilder类的append方法
StringBuilder继承了AbstractStringBuilder,而AbstractStringBuilder实现了appendable
StringBuilder:指挥者类,持有具体建造者的引用,由于StringBuilder继承了AbstractStringBuilder,这里StringBuilder通过super来作为具体建造者的引用。

AbstractStringBuilder:具体建造者,它实现了appendable接口的append(Character c)方法。

appendable:抽象建造者,定义了创建对象的接口。

  public StringBuilder(CharSequence seq) {this(seq.length() + 16);append(seq);}@Overridepublic StringBuilder append(Object obj) {return append(String.valueOf(obj));}@Overridepublic StringBuilder append(String str) {super.append(str);return this;}

2.SQL中的PreparedStatement

3.JDOM中,DomBuilder、SAXBuilder
SAXBuilder

SAXBuilder builder=new SAXBuilder(false);
Reader returnQuote = new StringReader(rexml);
Document doc = builder.build(returnQuote);
得到根元素:
Element books=doc.getRootElement();
在JDOM中所有的节点(DOM中的概念)都是一个org.jdom.Element 类,当然他的子节点也是一个org.jdom.Element类。
得到元素(节点)的集合:
List booklist=books.getChildren(“book”);

DomBuilder

DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Documentdoc=builder.newDocument();
Element root=doc.createElement("root");
Text text=doc.createText("Thisistheroot");
root.appendChild(text);
doc.appendChild(root);DOMBuilder builder=new DOMBuilder();
Document doc=builder.build(newFile("jdom_test.xml"));
SAXBuilder builder=new SAXBuilder();
Document doc=builder.build(url);

浅谈GOF设计模式之建造者模式(五)相关推荐

  1. python工厂模式 理解_浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  2. 浅谈PHP设计模式的门面模式

    简介: 门面模式又称之为外观模式,属于结构型的设计模式. 用于为子系统中的一组接口提供一致的调用方案.门面模式定义了一个高层接口,引入门面角色之后,只需要直接与门面角色交互,降低了系统的耦合度. 适用 ...

  3. java mediator_浅谈Java设计模式——中介者模式(Mediator)

    一.概述 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介对象用来封装对象之间的关系,各个对象可以不需要知道具体的信息 ...

  4. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  5. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  6. 浅谈命令查询职责分离(CQRS)模式

    浅谈命令查询职责分离(CQRS)模式 在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体.在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复 ...

  7. D5:C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  8. 建造者模式java_java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

  9. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  10. 浅谈ASP.NET内部机制(五)

    浅谈ASP.NET内部机制(五) 前言:本章要谈页面生命周期了,过程挺多的,但是一点都不难.不信可以看看.我尽量的讲的平实一些,而且理解页面的生命周期对喜欢开发自定义控件和组件的朋友是很有帮助的. 系 ...

最新文章

  1. sdut2772 KMP的简单应用
  2. Facebook:使用Libra完成第一笔交易
  3. wxWidgets:wxConfig 概述
  4. 深入理解C/C++函数指针
  5. c语言万年历附加功能,万年历(c语言,多功能).doc
  6. python如何进行垃圾回收_python垃圾回收机制
  7. 在将hibernate的session托管给spring过程中的问题
  8. 失落的国庆假日,无奈的中秋佳节!
  9. jQuery Ajax请求成功后,为什么一直在error函数里
  10. Facebook分享动态内容
  11. 2021爱分析·中国人工智能应用趋势报告——新基建助推,人工智能应用迈入新阶段
  12. 七牛云异步抓取java_异步第三方资源抓取
  13. SST-Calib:结合语义和VO进行时空同步校准的lidar-visual外参标定方法(ITSC 2022)
  14. ubuntu下街机模拟器 mame 安装和玩拳王97
  15. npm install 报错 Error: EACCES: permission denied解决方案
  16. python 抛出异常记录
  17. Resolution-robust Large Mask Inpainting with Fourier Convolutions(2021)
  18. 5G网络学习(三)——大白话讲解PDU会话(未完待续)
  19. 被误解最大的基础学科——统计学,到底是个啥?
  20. [机器学习-数学]什么是ESS/RSS/TSS

热门文章

  1. 学习记录:自平衡莱洛三角形v1(原理,代码)学习记录(一)
  2. VS2013新建项目出现脚本错误的解决办法
  3. 2017.9.29 红红火火恍恍惚惚
  4. IT公司内推 互联网内推 bat内推
  5. 【Android】手撸抖音小游戏潜艇大挑战
  6. angular里的$even和$odd的应用
  7. Win11打开控制面板的方法
  8. 5月地图软件影响力报告:百度谷歌搜狗居前三甲
  9. 姚爱红计算机组成原理知识要点,计算机组成原理课程混合教学模式探究
  10. matlab 创建网格图和曲面图