建造模式(Builder)体现了艺术性的“建造”,并不是像工厂模式一样简单地生产一个产品对象,提供给请求者就满足了。建造模式,在其建造地过程中,能够非常清晰将一个产品的组成部分分离开来,同时又能够在一定的指导下进行合理的组装起来,完成客户端更高要求的请求。
另外,作为产品类,它并非就是一个实实在在实体类,有时候一个产品类可能是一个能够完成相当复杂,或者具有相当关键的操作的具体类,甚至在系统的设计中位于十分核心的位置。如何合理地对这些产品类的对象进行组装的同时,可能依赖它们来完成某些业务过程。
建造模式的一般结构如图所示:
上图清晰地给出了建造模式所对应的角色,这四个角色为:
01.指导者角色
02.抽象建造者角色
03.具体建造者角色
04.具体产品角色
下面详细阐述建造模式中各个角色的具体含义:
01.指导者角色
指导者角色是建造模式中非常关键的一个角色,如果没有它,当客户端请求时,无法对产品进行有序合理地建造。指导者角色关注的是,抽象建造者角色所抽象出来操作步骤,并根据这些步骤给出一个合理的执行顺序来对产品对象进行装配建造。
一个指导者实现类可以指导多个产品对象的建造,亦即,指导者实现类是知道这个产品对象的具体组装顺序的,从而给抽象建造者类以帮助。但是,由于抽象建造者类并没有将具体的建造细节在指导者实现类中表现出来,所以指导者实现类对产品如何组装建造的细节一无所知。
如果必要的的话,指导者实现类在完成产品的组装以后,根据客户端调用所传达的启发式信息,返回建造的结果,以响应客户端的请求。
02.抽象建造者角色
抽象建造者角色是对产品建造过程的抽象,也就是对产品该如何组装建造进行规范化。但是,抽象建造者角色只是给出这些操作步骤的抽象方法,具体地建造实现有具体建造者角色来完成。可见,抽象建造者角色也无从知道产品的具体建造的细节。
在抽象建造者类的抽象设计中,如果不要求返回建造产品的对象,抽象建造者甚至都不知道具体建造的是哪一个产品对象,而只是知道某某对象先这样做,然后这样做,……,最后这样做。
03.具体建造者角色
具体建造这角色是与具体产品角色紧密联系的,而正是抽象建造者角色屏蔽了具体建造者角色所实现的操作的细节,使得指导者角色无法知道具体建造的细节。
具体建造者类非常熟悉产品的具体结构,都由哪些部分组成,调用产品对象的哪些方法能完成什么功能,等等。同时,具体建造者类继承(或实现)了抽象建造者规范定义的建造步骤(可能对哪一步在先,哪一步在后并不能确定),最终完成了产品的组装建造。
04.具体产品角色
具体产品角色,很显然代表了一个具体的产品对象,是具体建造者角色的直接数据来源。
具体产品实现类一般具有比较复杂的组成结构,如包含其他复杂的类属性,而这些类的对象的构造可能也相对复杂一些,这样才能发挥出具体建造者实现类的建造能力——将一个具有如此复杂组成的产品对象,根据抽象建造者类的指示,一个步骤一个步骤地完成某个小部件的构造,剩下的工作就是在指导者实现类的指导下进行组装了。
基于上面对建造模式的四个角色的理解的基础上,下面基于建造模式,通过实例进行分析设计。
第一种:
为了更加直观、形象,上图对组成具体产品的部件也进行了简单的设计,Part是构成具体产品的部件的统一接口,当然也可以是多个不同接口实现的部件构成的产品对象。该图比较清晰地表现出了建造模式中各个角色所对应的类,容易理解。
上面图中,需要说明的是,客户端调用指导者对象的时候,直接将构造产品对象的部件全部作为指导方法directBuild的参数值(引用)传递过来,所以要求抽象建造者只是以这些部件作为每个建造的方法(一个小步骤)的参数,以为具体建造者提供规范。
在实际系统设计中,构成产品对象的全部小部件所需要的基本类型数据完全被发送到指导者对象那里,然后指导者委托抽象建造者根据这些基本类型数据进行规划设计,抽象出建造方法,等待具体建造者来具体实现。此时,具体建造者需要对某个或者某些部件进行加工构造。
第二种:
上面这个图,体现了基于建造模式的设计的扩展,它要求对抽象建造者类的设计具有更好的通用性,能够适应由于具体产品对象的组成变化,而能够通过扩展抽象建造者类,在具体建造者类中来实现具体产品对象的建造。
其中,ConcreteProduct与OtherConcreteProduct产品类对象分别都是由SequencePart与DirectionPart的具体部件所组成,并分别通过ConcreteBuilder与OtherConcreteBuilder具体建造者类对象来实现产品的组装建造。
当然,如果客户端请求者要求返回实际对应的产品对象的话,使用建造模式就可能不能够很好地进行扩展了,因为多个客户端可能要求建造的产品对象,必须通过抽象建造者类来返回,所以,除非将全部可能的返回类型都包括——自然而然想到,返回类型是Object即可,然后客户端会根据自己的实际需要进行类型强制转换获得,满足自身请求的需要。
分享到:
相关推荐
设计模式是软件工程中的一种重要概念,它代表了在软件设计和开发中反复出现的问题的通用解决方案。GoF,即Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者,他们在《设计模式:可重用面向对象...
在 JAVA 编程中,有时候看起来非常直接的实现却非要用设计模式转假设干个弯去实现他,但是采用一些成熟的设计模式,会使程序更加的强健、松耦合以及好维护和扩展。 DAO 设计模式背景: * 数据源的不同,数据的方法...
在软件开发领域,设计模式是经过时间和实践验证的解决方案,用于解决常见的编程问题。C语言,虽然不常被用来实现面向对象的设计模式,但通过结构体、指针和函数等特性,同样可以实现多种设计模式。这个压缩包“使用...
在软件开发领域,设计模式是经过时间和实践验证的解决方案模板,用于解决常见问题。本作业以“软件设计模式”为主题,特别关注了装饰模式、工厂模式和适配器模式的运用。这三种模式都是面向对象设计的核心部分,它们...
在这篇文章中,我们将探讨六种常见的微服务架构设计模式:聚合器微服务设计模式、代理微服务设计模式、链式微服务设计模式、分支微服务设计模式、数据共享微服务设计模式和异步消息传递微服务设计模式。 聚合器...
嵌入式系统设计模式是在嵌入式系统开发领域中,针对特定问题的解决方案的模板或模式。由于嵌入式系统具有资源有限、实时性强、安全性要求高等特点,因此在设计时往往需要使用特定的设计模式来应对这些挑战。本书《C...
"设计模式" 在软件开发中,设计模式是一种解决特定问题的通用方法。它可以帮助开发者编写更加灵活、可维护、可扩展的代码。本书《您的设计模式》对设计模式进行了详细的讲解,涵盖了策略模式、代理模式、单例模式、...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。刘伟先生在讲解设计模式时,通常会深入浅出地介绍这些模式的原理、应用场景以及如何有效地在实际编程中应用它们。设计模式并不是...
《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》是一本深入探讨软件设计模式的书籍,它涵盖了创建型、结构型和行为型三种主要类型的23个经典设计模式,并提供了C++语言的实现代码。设计模式是软件工程中的...
### 设计模式精解——GoF 23种设计模式解析及C++实现 #### 0. 引言 设计模式作为面向对象编程的核心组成部分,是软件开发者在长期实践中总结出来的最佳实践。通过深入理解这些设计模式,我们可以更好地进行面向...
《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...
### Java设计模式详解 #### 一、背景与概念 在软件工程领域,设计模式是一种用于解决常见问题的可重用解决方案。《Java设计模式PDF》是一本由James W. Cooper编写的经典书籍,该书详细介绍了Java编程语言中的设计...
Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种在特定情境下为了解决常见问题而制定的通用解决方案的描述。它们描述了...
DAO(Data Access Object)设计模式是软件开发中一种常见的用于处理数据访问的模式,它将业务逻辑与数据访问逻辑分离,使得代码结构更加清晰,更易于维护和测试。在Java开发中,DAO模式广泛应用于数据库操作,为应用...
这个压缩包文件名为“23种设计模式示例源码”,暗示其中包含了解决23种经典设计模式的具体实现代码,这对于初学者或者希望深入理解设计模式的开发者来说是一份宝贵的资源。下面将对这23种设计模式进行详细解释。 1....
在LabVIEW编程中,设计模式是解决常见问题的可复用解决方案,可以提高代码的可读性、可维护性和效率。本篇文章将深入探讨三种重要的LabVIEW设计模式:生产消费者模式、事件状态机和状态机模式。 ### 生产消费者模式...
《C#设计模式PDF 电子书》是一本专注于C#编程语言中设计模式的应用和解析的书籍,2005年04版意味着它在设计模式领域的应用尚处于早期阶段,但仍然具有很高的学习价值。设计模式是软件工程中经过实践验证的、解决常见...
在软件开发领域,设计模式是经验丰富的开发者们总结出的解决常见问题的最佳实践。Java作为一门广泛应用的开发语言,其设计模式的应用对于提高代码质量、可维护性和可扩展性至关重要。本文将着重探讨创建型模式、结构...