浅谈建造者模式

合集下载

建造者模式的理解

建造者模式的理解

建造者模式的理解建造者模式是⼀种对象构建设计模式,它提供了⼀种构建对象的最佳⽅式。

这种类型的设计模式属于创建型模式,它提供了⼀种创建对象的最佳⽅式。

在建造者模式中,我们将⼀个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式的⽬的是为了解决⼤型复杂对象的构建与其表示之间的耦合问题,它将构建对象的最佳⽅式交由专⻔的构建步骤来决定,⽽这个专⻔的构建步骤就是指挥者,指挥者负责组织各个部件的构建顺序,并依次调⽤每个部件的建造⽅法,从⽽完成复杂对象的构建。

建造者模式的适⽤场景包括:1.需要构建的对象具有复杂的内部结构,这些对象通常包含许多属性和⽅法;2.构建过程是独⽴于其他对象的,并且是可重⽤的;3.构建过程应当被封装起来,使得构建的步骤按照⼀定的顺序执⾏。

在实现建造者模式时,我们需要遵循以下原则:1.将⼀个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示;2.创建型模式以某种⽅式修改请求的结构或表示。

由于结构问题产⽣的任何变化,都会改变这些类的⾏为。

因此,当需求发⽣改变时,我们可以修改请求的类⽽不是修改接收请求的类;3.创建型模式在客户端和抽象之间引⼊了⼀个指挥者类。

客户端通过指挥者类与抽象交互,从⽽实现了请求的结构或表示的修改。

由于指挥者类的引⼊,客户端不再直接与抽象交互,因此我们可以通过添加新的指挥者类来改变请求的发送⽅式。

建造者模式的优点包括:1.它提供了⼀种构建对象的最佳⽅式。

通过将构建过程抽象化,我们可以更加灵活地创建复杂的对象。

2.它使得构建过程与使⽤过程分离。

使⽤者只需要知道如何使⽤对象,⽽不需要关⼼对象的构建过程。

这使得代码更加简洁和易于维护。

3.它⽀持可复⽤的部件。

每个部件都是独⽴的,可以被复⽤在不同的构建过程中。

这提⾼了代码的复⽤性。

4.它使得对象构建更加灵活。

通过改变指挥者类的实现,我们可以改变对象的构建过程,从⽽实现不同的构建策略。

然⽽,建造者模式也有⼀些缺点:1.它增加了系统的复杂度。

设计模式中的建造者模式及应用

设计模式中的建造者模式及应用

设计模式中的建造者模式及应用随着软件开发的不断推进,在设计模式中出现了越来越多的模式来协助我们更加有效地开发软件。

设计模式是一套可以解决特定问题的经典方法,它们提供了经过测试和验证的解决方案,可以在软件开发过程中减少错误和提高效率。

本文将介绍设计模式中的建造者模式及其应用。

一、什么是建造者模式?建造者模式是一种创建型设计模式,它允许我们通过分步骤构造复杂对象来创建不同类型和表示形式的对象。

该模式允许我们将对象的构造过程与其表示分离开来,从而可以独立地进行构建。

在建造者模式中,我们将一个大的构建步骤分解成若干个小的构建步骤,从而使得建造者可以按照需要组合和复用这些步骤。

这些步骤中的每一个都会返回自己的对象,这些对象最终会组合成一个完整的对象。

二、建造者模式的实现建造者模式的主要参与方包括产品、建造者和指挥者。

产品是最终被构建的对象,建造者是实际创建产品对象的类,而指挥者则是负责使用建造者对象构建产品对象。

下面是一个简单的建造者模式示例:1. 创建产品类public class Product {private String partA;private String partB;private String partC;public void setPartA(String partA) {this.partA = partA;}public void setPartB(String partB) {this.partB = partB;}public void setPartC(String partC) {this.partC = partC;}//其他方法}2. 创建建造者类public interface Builder {void buildPartA();void buildPartB();void buildPartC();Product getResult();}public class ConcreteBuilder implements Builder {private Product product;public ConcreteBuilder() {product = new Product();}@Overridepublic void buildPartA() {product.setPartA("PartA of the product"); }@Overridepublic void buildPartB() {product.setPartB("PartB of the product"); }@Overridepublic void buildPartC() {product.setPartC("PartC of the product");}public Product getResult() {return product;}}3. 创建指挥者类public class Director {private Builder builder;public Director(Builder builder) { this.builder = builder;}public void construct() {builder.buildPartA();builder.buildPartB();builder.buildPartC();}}4. 使用建造者模式创建产品public class Client {public static void main(String[] args) {Builder builder = new ConcreteBuilder(); Director director = new Director(builder); director.construct();Product product = builder.getResult();}}以上就是建造者模式的一个简单实现。

简说设计模式——建造者模式

简说设计模式——建造者模式

简说设计模式——建造者模式⼀、什么是建造者模式 我们先说⼀个⽣活中的⼩例⼦,当我们在外⾯饭店吃饭时,⽐如点个⽔煮⾁⽚,这家店可能会辣⼀点、那家店可能会咸⼀点、对⾯那家可能放青菜、隔壁那家可能放菠菜,每家店做出来的都不⼀样,明明都是⽔煮⾁⽚却有不同的做法,如果都⼀样就不会说这家难吃那家好吃了。

那再看快餐店,⽐如KFC,我们点个⾄尊虾堡,所有⼈不管在哪个城市哪家店,做法、味道都是⼀样的,为什么呢,因为它⽤料、时间、温度等等都是严格规定的,我们只需要下订单就⾏了,这就是⼀个建造者模式。

建造者模式(Builder),将⼀个复杂的对象的构建与它的表⽰分离,使得同样的构建过程可以创建不同的表⽰。

UML结构图如下:其中,Director为指挥者/导演类,负责安排已有模块的顺序,然后告诉Builder开始建造;Builder是抽象建造者,规范产品的组建,⼀般由⼦类实现;ConcreteBuilder是具体建造者,实现抽象类定义的所有⽅法,并且返回⼀个组建好的对象;Product是产品类,通常实现了模板⽅法模式。

1. Director类导演类起到封装的作⽤,避免⾼层模块深⼊到建造者内部的实现类。

在建造者模式⽐较庞⼤时,导演类可以有多个。

1public class Director {23public void Construct(Builder builder) {4 builder.BuildPartA();5 builder.BuildPartB();6 }78 }2. Builder类抽象建造者类,确定产品由两个部件PartA和PartB组成,并声明⼀个得到产品建造后结果的⽅法getResult()。

public abstract class Builder {public abstract void BuildPartA(); //产品的A部件public abstract void BuildPartB(); //产品的B部件public abstract Product getResult(); //获取产品建造后结果}3. ConcreteBuilder类具体建造者类,有⼏个产品类就有⼏个具体的建造者,⽽且这多个产品类具有相同的接⼝或抽象类。

建造者模式在项目中的应用

建造者模式在项目中的应用

建造者模式在项目中的应用一、引言建造者模式是一种创建型设计模式,它允许你分步骤地构造复杂对象。

该模式允许你使用相同的创建代码生成不同类型和形式的对象。

在本文中,将介绍建造者模式在项目中的应用,包括建造者模式的基本概念、优点和缺点,以及如何在项目中实现建造者模式。

二、建造者模式的基本概念1. 建造者:定义了产品的创建过程和最终结果,并提供了一个接口来返回最终创建结果。

2. 具体建造者:实现了建造者接口,并提供了具体的创建方法。

3. 产品:表示被构建的复杂对象。

4. 指挥者:指导具体建造者如何构建产品。

三、建造者模式的优点1. 将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

2. 可以更加精细地控制对象的构建过程,从而可以更好地满足需求。

3. 可以减少重复代码,提高代码复用性。

四、建造者模式的缺点1. 建造者模式需要额外定义多个类,增加了系统复杂度。

2. 对象必须有一个共同的接口,才能使用相同的构建过程。

五、建造者模式在项目中的应用建造者模式在实际项目中有很多应用场景,以下是其中几个典型的应用场景。

1. 安装程序安装程序通常需要进行一系列操作,例如检查系统配置、安装文件、创建快捷方式等。

这些操作可以使用建造者模式来实现。

具体建造者可以是不同类型的安装程序,例如 Windows 安装程序和 Linux 安装程序。

2. 网站生成器网站生成器通常需要根据用户需求生成不同类型和形式的网站。

这些网站可以使用建造者模式来实现。

具体建造者可以是不同类型的网站生成器,例如博客生成器和电商网站生成器。

3. 游戏角色创建在游戏开发中,角色创建通常需要进行一系列操作,例如选择职业、设置属性、选择技能等。

这些操作可以使用建造者模式来实现。

具体建造者可以是不同类型的角色创建器,例如战士创建器和法师创建器。

4. 订单处理订单处理通常需要根据用户需求生成不同类型和形式的订单。

这些订单可以使用建造者模式来实现。

建造者设计模式的特点

建造者设计模式的特点

建造者设计模式的特点
建造者设计模式的特点主要包括以下几个方面:
1. 分离构建过程和表示:建造者模式将一个复杂对象的构建过程与它的表示分离开来,使得同样的构建过程可以创建不同的表示。

2. 隐藏产品内部细节:通过建造者模式,产品的具体实现细节被隐藏在具体建造者类中,客户端只需要知道如何调用建造者来构建产品即可,无需关心产品的具体构建过程。

3. 可以灵活选择构建过程中的具体实现:建造者模式允许客户端通过指定不同的具体建造者来选择不同的构建过程,从而创建不同的产品表现形式。

4. 避免重复创建对象:建造者模式中,通过指导者类来负责组织建造者类的调用顺序,使用同一个指导者对象可以重复执行相同的构建过程来创建不同的产品对象。

5. 客户端与产品的耦合度低:建造者模式通过引入指导者类,将客户端与产品的创建过程解耦,客户端只需通过指导者来创建产品,无需直接与具体的产品类交互。

综上所述,建造者设计模式主要特点是将复杂对象的构建过程与表示分离,隐藏
了产品内部细节,提供了灵活选择构建过程的方式,避免了重复创建对象,同时降低了客户端与产品的耦合度。

建造者模式的步骤和关键技术

建造者模式的步骤和关键技术

建造者模式的步骤和关键技术建造者模式是一种创建型设计模式,它允许您将一个复杂的对象构建过程与其表示分离,从而使您能够单独生成和复用该对象表示。

在使用建造者模式时,您需要了解其步骤和关键技术。

下面将分别介绍这两个方面。

一、建造者模式的步骤1. 定义产品类:在建造者模式中,首先需要定义产品类。

产品类是您要创建的对象的基础。

2. 定义抽象建造者:抽象建造者是一个接口或抽象类,它定义了构建过程中要实现的方法。

这个接口将建造者从正在构建的对象表示中分离出来。

3. 实现具体建造者:具体建造者实现了抽象建造者接口中定义的方法,并创建了要构建的对象表示。

4. 定义指挥者:指挥者是一个接口或抽象类,它定义了执行构建过程的方法。

指挥者将具体建造者与产品类分离出来。

5. 实现具体指挥者:具体指挥者实现了指挥者接口中定义的方法,并使用具体建造者来构建要创建的对象表示。

6. 使用建造者模式构建对象:使用建造者模式创建一个对象表示需要实例化一个指挥者对象,并将一个具体建造者对象传递给它。

二、建造者模式的关键技术1. 建造者中的产品表示:在建造者模式中,产品表示是构建对象过程中要创建的对象。

这个对象可能是一个具有多个属性和方法的类,也可能是一个简单的数据结构。

2. 建造者接口或抽象类:一个建造者需要实现的方法由一个接口或抽象类定义。

这个接口或抽象类会告诉建造者应该做什么,如何做。

3. 具体构造者:具体构造者实现建造者接口或抽象类中定义的方法。

它们实际上构建了产品表示,并返回最终的结果。

4. 指挥者:指挥者是与具体构造者交互的对象。

它知道构建对象所需的步骤,并且使用它们来联系具体构造者。

它还可能使用基于某些条件的不同建造方案。

5. 建造者模式的优点:建造者模式允许您将复杂对象的构建步骤分离,并使您能够更好地控制它们。

它还可以提高对象表示的可重用性,并使更改该表示变得更加容易。

综上所述,建造者模式是一种创建型设计模式,它允许您将一个复杂的对象构建过程与其表示分离,从而使您能够单独生成和复用该对象表示。

C#设计模式之建造者设计模式(Builde)

C#设计模式之建造者设计模式(Builde)

产品(Product)角色:产品便是建造中的复杂对象。
指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具造者(Builder)模式
建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
对象性质的建造
有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出。
具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:
实现Builder角色提供的接口,一步一步完成创建产品实例的过程。
在建造过程完成后,提供产品的实例。
指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。
命名的考虑
之所以使用"建造者"而没有用"生成器"就是因为用零件生产产品,"建造"更为合适,"创建"或"生成"不太恰当。
二、Builder模式的结构:
建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。

设计模式学习之建造者模式

设计模式学习之建造者模式

跟JBPM学设计模式之建造者模式模式简介建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

一个产品常常会有不同的组成成分作为零部件,这些零件可能是对象,也可能不是对象,他们通常由叫做产品的内部表象。

不同的产品可以有不同的内部表象,也就是不同的零部件。

使用建造者模式可以使客户端不需要知道所生成的产品对象有哪些零部件,每个产品的相应零部件有什么不同,是怎么建造出来的,以及是怎样组成产品的。

建造者模式的简图如下图1. 建造者模式结构图在这个示意图中,最终产品是由两部分组成的,所以相应的建造方法也有两个。

这个模式涉及到一下四个角色。

抽象建造者角色:给出一个接口,规范产品对象的各个组成部分的建造。

一般而言此接口独立于应用程序的商业逻辑。

模式中直接创建产品的具体建造者,必须实现这个接口所要求的两种方法,一种是建造方法,比如图中BuildPart1()和BuildPart2;另外一种是结果返回方法,即图中的GetProduct()。

一般来说产品所包含的零部件数目与建造方法的数目相符。

具体建造者角色:担任这个角色的是与应用程序紧密相关的一些类,他们在应用程序调用下创建产品的实例。

其需要完成任务包括:实现抽象建造者builder所声明的接口,给出一步一步创建产品实例的操作。

建造过程完成后,提供产品的实例。

导演者角色:其调用具体的建造者角色以创建产品对象。

应当指出的是,导演者角色并没有产品类的具体知识,真正具有与产品类具体知识的是具体的建造者角色。

产品角色:产品就是模式中要建造的复杂对象。

导演者角色是与客户端打交道的角色。

导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。

具体建造者角色是做具体建造工作的,但是却不为客户端所知。

一般而言,每有一个产品类,就有一个相应的具体建造者类。

这些产品应当有一定数目的零件,而每有一个两件就相应的在所有建造者橘色里有一个建造方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浅谈建造者模式
“设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。

使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

”在设计模式这门课程的学习中,我们了解到了有23种设计模式,每种模式都有他们的特色,而在学习设计模式的过程中,最令我印象深刻的就是建造者模式。

建造者模式是一种较为复杂的创建型模式,他将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂对象的内部组成部分与装配方式,只需知道所需的建造者类型即可。

建造者模式关注一步一步地创建一个复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立,增加新的建造着非常方便,无需修改已有代码,系统具有较好的扩展性。

这让我联想到了游戏里面的角色设计,如果每个新角色的设计都要重新编写代码的话就会耗费相当大的功夫,但是如果用建造者模式的思想来设计的话就会轻松很多,增加新的建造者非常方便,无需修改已有代码,可以提高代码的复用率,减少重复“造轮子”的时间。

结合本学期所学到的设计模式知识以及以前学的专业知识,我做了一个LOL(英雄联盟)角色设计的小项目。

在这个项目中,我使用了五个类来进行编写(代码详情见src文件夹)。

图1 LOL角色设计结构图
(1)Builder(抽象建造者):构建者接口,定义构建各部件的方法。

(2)RoleBuilder (具体建造者):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。

(3)Role(产品角色):表示被构造的角色。

RoleBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

(4)Director(指挥者):构造一个使用Builder接口的对象。

(5)Client(成品类):将所设计的角色在控制台进行输出。

在编写的过程中,我发现建造者模式与抽象工厂模式有点相似,但是建造者模式返回的是一个完整的复杂产品,而抽象工厂模式则是返回一系列相关的产品。

在抽象工厂模式中,客户端通过选择具体工厂来生成所需对象,而在建造者模式中,客户端通过指定具体建造者类型并指导Director类如何去生成对象,然后将结果返回。

我觉得,在建造者模式中,最重要的一点就是它引进了Director()类,它一方面隔离了客户与创建过程,另一方面也控制了产品的创建过程,指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,就可以通过指挥者类调用建造者的相关方法,这让我联想到了生活中的案例,例如客户想要自己组装一台电脑,销售人员只需要确定客户的需求,就可以以让组装人员为客户组装电脑,客户无
需了解装配的具体过程。

所以设计模式中的很多模式都是来源于生活,然后又作用于生活,不禁令我赞叹于前人的智慧。

这也让我有所启发,学习设计模式,不能只拘泥于形式,重要的是其中的思想,要在运用时能够信手拈来。

而要做到这点,就要求我们要学会观察生活,尤其是我们学习计算机的学生,更加要观察生活,因为我们编程就是为了让世界变得更美好,让人们生活得更加方便。

在此次的小项目中,我就联想到了游戏里面人物的设计,游戏需要更新,角色需要增加,但是不可能每增加一个角色就改所有的代码,所以我想到了使用建造者模式来解决这一问题。

在我的小项目里面,如果要修改角色信息,只需要更改RoleBuilder()类即可,如果想要增加新角色,可以增加一个新的具体角色建造类,原有代码无需修改,这完全符合设计模式的开闭原则。

凡事有利也有弊,建造者模式也一样,通过这次的项目开发,我了解到建造者模式的优点:(1)在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建进行解耦,使得相同的创建过程可以创建不同的产品对象。

在我编写的LOL角色创建项目里,我就利用了这一点来进行角色的创建,只需要修改或者增加少量的代码,就可以达到目的。

(2)每一个具体建造者都是独立的,与其他的具体建造者无关,因此可以很方便的替换具体建造者或增加具体建造者用户使用不同的具体建造者即可得到不同的产品对象,由于指挥者类针对抽象建造者编程,增加新的具体建造者无需修改原有类库的代码,系统扩展方便,符合开闭原则。

在代码编写中,代码复用率是尤为重要的,我此次的项目也极力地做到大多数代码能够重复使用。

(3)用户可以更加精细的控制产品的创建过程,将复杂的产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。

我此次的项目分为5个类,实现了LOL角色设计的分解,也使得代码条理清晰,创建也更加方便。

但是建造者模式也有缺点,建造者模式的缺点:
(1)建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性较大,例如很多组成部分不相同,则不适合使用建造者模式,因此使用范围收到一定的限制。

在此次LOL 角色设计的项目中,我就体会到了这一点,我所设计的角色,都是大同小异,不能够有特殊的东西,不然就无法实现,这也是建造者模式的一个局限性之所在。

(2)如果产品的内部变化复杂,可能会需要定义很多具体建造者类来实现这种变化,导致系统变得和庞大,增加了系统的理解难度和运行成本。

在此次代码的编写中,为了实现不同的角色实例,必须要建不同的具体类,这样长此以往,有多少个角色就要增加多少个类,这会大大增加产品的内存占用率,这对于用户来说是不愿意看到的
经过这次LOL角色设计的小项目,我更加深刻地体会到了设计模式的重要性,它在我们的编程过程中,有着举足轻重的作用,尤其是对建造者模式有了更加深入的体会。

我意识到,建造者模式的核心在于如何一步一步地构建一个包含多个组成部件的完整对象,使用相同的构建过程构建不同的产品。

在编程中要多使用设计模式,使我们的代码具有更高的可读性和可复用性。

参考文献
[1] 刘伟,胡志刚,郭克华.设计模式.北京:清华大学出版社,2011
[2]刘继华.漫谈设计模式——从面向对象开始.北京:清华大学出版社,2012
[3]莫永腾.深入浅出设计模式(C#/Java).北京:清华大学出版社,2006
[4]陈臣,王斌.研磨设计模式.北京:清华大学出版社,2010
[5]秦小波.设计模式之禅.北京:机械工业出版社,2010。

相关文档
最新文档