热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GOF23设计模式之建造者模式(builder)

一、建造者模式概述建造者模式的本质:1.分离了对象子组件的单独构造(由Builder负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的过程

一、建造者模式概述

  建造者模式的本质:

    1.分离了对象子组件的单独构造(由Builder负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的过程复杂的情况下使用。

    2.由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法,装配算法的解耦,实现了更好的复用。

二、建造者模式

  1.创建飞船部件及飞船

 1 /**
 2  * 飞船
 3  * @author CL
 4  *
 5  */
 6 public class Airship {
 7     private Engine engine;    //发动机
 8     private OrbitalMouble orbitalMouble;    //轨道舱
 9     private EscapeTower escapeTower;    //逃逸塔
10     
11     public void launch() {
12         System.out.println("发射!");
13     }
14     
15     public Engine getEngine() {
16         return engine;
17     }
18     public void setEngine(Engine engine) {
19         this.engine = engine;
20     }
21     public OrbitalMouble getOrbitalMouble() {
22         return orbitalMouble;
23     }
24     public void setOrbitalMouble(OrbitalMouble orbitalMouble) {
25         this.orbitalMouble = orbitalMouble;
26     }
27     public EscapeTower getEscapeTower() {
28         return escapeTower;
29     }
30     public void setEscapeTower(EscapeTower escapeTower) {
31         this.escapeTower = escapeTower;
32     }
33     
34 }
35 
36 /**
37  * 发动机类 
38  */
39 class Engine {
40     private String name;
41 
42     public Engine(String name) {
43         this.name = name;
44     }
45 
46     public String getName() {
47         return name;
48     }
49 
50     public void setName(String name) {
51         this.name = name;
52     }
53     
54 }
55 
56 /**
57  * 轨道舱类
58  */
59 class OrbitalMouble {
60     private String name;
61 
62     public OrbitalMouble(String name) {
63         this.name = name;
64     }
65 
66     public String getName() {
67         return name;
68     }
69 
70     public void setName(String name) {
71         this.name = name;
72     }
73 }
74 
75 /**
76  * 逃逸塔类
77  */
78 class EscapeTower {
79     private String name;
80 
81     public EscapeTower(String name) {
82         this.name = name;
83     }
84 
85     public String getName() {
86         return name;
87     }
88 
89     public void setName(String name) {
90         this.name = name;
91     }
92 }

  2.创建飞船的构建接口和装配接口

 1 /**
 2  * 飞船的构建者
 3  * @author CL
 4  *
 5  */
 6 public interface AirshipBuilder {
 7     /**
 8      * 构建发动机
 9      * @return
10      */
11     Engine builderEngine();
12     /**
13      * 构建轨道舱
14      * @return
15      */
16     OrbitalMouble builderOrbitalMouble();
17     /**
18      * 构建逃逸塔
19      * @return
20      */
21     EscapeTower builderEscapeTower();
22 }
 1 /**
 2  * 飞船的装配者
 3  * @author CL
 4  *
 5  */
 6 public interface AirshipDirector {
 7     /**
 8      * 装配飞船
 9      * @return
10      */
11     Airship directorAirship();
12 }

  3.创建构建接口和装配接口的实现类

 1 /**
 2  * XAAU牌飞船构建者的实现类
 3  * @author CL
 4  *
 5  */
 6 public class XAAUAirshipBuilder implements AirshipBuilder {
 7 
 8     public Engine builderEngine() {
 9         System.out.println("构建发动机");
10         return new Engine("XAAU牌发动机");
11     }
12 
13     public OrbitalMouble builderOrbitalMouble() {
14         System.out.println("构建轨道舱");
15         return new OrbitalMouble("XAAU牌轨道舱");
16     }
17 
18     public EscapeTower builderEscapeTower() {
19         System.out.println("构建逃逸塔");
20         return new EscapeTower("XAAU牌逃逸塔");
21     }
22 
23 }
 1 /**
 2  * XAAU牌飞船装配者的实现类
 3  * @author CL
 4  *
 5  */
 6 public class XAAUAirshipDirector implements AirshipDirector {
 7     
 8     private AirshipBuilder builder;
 9     
10     public XAAUAirshipDirector(AirshipBuilder builder) {
11         this.builder = builder;
12     }
13 
14     public Airship directorAirship() {
15         //构建飞船部件
16         Engine e = builder.builderEngine();
17         OrbitalMouble o = builder.builderOrbitalMouble();
18         EscapeTower et = builder.builderEscapeTower();
19         
20         //装配成飞船对象
21         Airship ship = new Airship();
22         ship.setEngine(e);
23         ship.setOrbitalMouble(o);
24         ship.setEscapeTower(et);
25         
26         return ship;
27     }
28 
29 }

  4.测试

 1 /**
 2  * 利用建造者模式创建XAAU牌飞船对象的实例
 3  * @author CL
 4  *
 5  */
 6 public class Client {
 7 
 8     public static void main(String[] args) {
 9         AirshipDirector director = new XAAUAirshipDirector(new XAAUAirshipBuilder());
10         
11         Airship ship = director.directorAirship();
12         
13         System.out.println(ship.getEngine().getName());
14         System.out.println(ship.getOrbitalMouble().getName());
15         System.out.println(ship.getEscapeTower().getName());
16         
17         ship.launch();
18     }
19 }

  控制台输出:

构建发动机
构建轨道舱
构建逃逸塔
XAAU牌发动机
XAAU牌轨道舱
XAAU牌逃逸塔
发射!

三、建造者模式常见应用场景

  (1)StringBuilder类中的append方法;

  (2)SQL中的PreparedStatement;

  (3)JDOM中,DomBuilder、SAXBuilder;

  (4)………………

GOF23设计模式之建造者模式(builder)


推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Java_脚本引擎_01_用法入门
    java,脚本,引 ... [详细]
  • 支付宝老的wap支付接口支付交易处理失败,请稍后再试。(ALI14)
    支付宝老的wap支付接口支付交易处理失败,请稍后再试。(ALI14)service:alipay.wap.trade.c ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
author-avatar
-qone0_784
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有