一、什么是建造者模式?
建造者模式(builder pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这个模式主要应用于那些构建过程复杂且涉及多个步骤的场景,特别适合于需要灵活配置且逐步构建的对象。
1.1. 设计模式分类
设计模式(design patterns)分为三大类:
- 创建型模式(creational patterns):关注如何创建对象的设计模式。
- 结构型模式(structural patterns):关注如何通过组合对象来构建更大的结构。
- 行为型模式(behavioral patterns):关注对象之间如何进行交互和职责分配。
建造者模式属于创建型模式,它的目的是通过分步构建,避免构造复杂对象时需要过多的参数或复杂的配置。
1.2. 为什么使用建造者模式?
在许多情况下,我们会遇到这样的问题:某些对象非常复杂,构建它们时需要多个步骤,这些步骤又可能是可选的,或者需要根据不同的需求使用不同的配置。直接通过构造函数来构建这样复杂的对象,不仅代码重复,而且不易扩展。建造者模式通过将构建过程分解成多个步骤,使得对象的创建过程更具灵活性,且客户端代码更加简洁。
二、建造者模式的结构
建造者模式的核心思想是将对象的创建过程分成多个步骤,而这些步骤可以独立进行组合。 建造者模式一般包含以下几个组成部分:
2.1. 组成部分
- 产品类(product):
- 产品类是最终构建出来的对象,它通常是一个复杂对象,包含多个部件和属性。
- 抽象建造者(builder):
- 抽象建造者声明了构建产品的各个步骤,例如设置不同的部件,获取最终的产品等。通常是一个接口或者抽象类,提供一组构建方法。
- 具体建造者(concrete builder):
- 具体建造者实现了抽象建造者的方法,并为构建产品的每一步提供具体的实现。它管理着产品的组成部分,并在最后生成产品。
- 指挥者(director):
- 指挥者负责定义构建过程的顺序,调用具体建造者的方法来完成复杂对象的构建。指挥者并不关心产品的具体细节,而是将构建过程委托给建造者来完成。
三、建造者模式的工作流程
建造者模式的工作流程通常如下:
- 客户创建一个指挥者对象,并通过它指定所需的建造者(通常是某个具体的建造者类)。
- 指挥者会按照顺序调用建造者中的各个方法,逐步构建产品。
- 具体建造者负责逐步构建产品的各个部分(如设置不同的部件或配置)。
- 最终产品在构建完成后返回给客户,客户可以根据需求使用该产品。
四、示例:构建一个复杂的汽车对象
4.1. 定义产品类:car
在本例中,我们要构建的产品是一个复杂的 car
类。该类有多个部件和属性,包括引擎类型、车轮数量、是否有 gps、是否有天窗等。
public class car { public string engine { get; set; } public int wheels { get; set; } public bool hasgps { get; set; } public bool hassunroof { get; set; } public override string tostring() { return $"car [engine: {engine}, wheels: {wheels}, gps: {hasgps}, sunroof: {hassunroof}]"; } }
car
类有四个主要属性,分别是:engine
(引擎类型),wheels
(车轮数),hasgps
(是否有 gps),hassunroof
(是否有天窗)。这些属性是构成汽车的基本部分。
4.2. 创建抽象建造者:icarbuilder
icarbuilder
是一个接口,定义了构建汽车的步骤(例如构建引擎、车轮、gps 和天窗等):
public interface icarbuilder { void buildengine(); void buildwheels(); void buildgps(); void buildsunroof(); car getresult(); }
icarbuilder
接口提供了五个方法:
buildengine()
:构建引擎。buildwheels()
:构建车轮。buildgps()
:构建 gps。buildsunroof()
:构建天窗。getresult()
:返回最终构建好的产品car
对象。
4.3. 创建具体建造者:sportscarbuilder
sportscarbuilder
类是一个具体的建造者,它实现了 icarbuilder
接口,负责具体构建一个运动型汽车:
public class sportscarbuilder : icarbuilder { private car _car = new car(); public void buildengine() { _car.engine = "v8 engine"; // 运动型车的引擎 } public void buildwheels() { _car.wheels = 4; // 标准运动型车有4个轮子 } public void buildgps() { _car.hasgps = true; // 运动型车需要 gps } public void buildsunroof() { _car.hassunroof = true; // 运动型车有天窗 } public car getresult() { return _car; // 返回构建好的汽车 } }
在 sportscarbuilder
中,每个方法实现了具体的构建步骤,逐步设置汽车的属性。最后,getresult()
方法返回构建完成的 car
对象。
4.4. 创建指挥者:cardirector
指挥者类 cardirector
负责按照一定顺序调用建造者的方法来构建汽车:
public class cardirector { private icarbuilder _carbuilder; public cardirector(icarbuilder carbuilder) { _carbuilder = carbuilder; } public car constructcar() { _carbuilder.buildengine(); _carbuilder.buildwheels(); _carbuilder.buildgps(); _carbuilder.buildsunroof(); return _carbuilder.getresult(); } }
cardirector
类使用 icarbuilder
来完成汽车的构建过程。constructcar()
方法按照固定的顺序调用建造者的构建方法,最后返回构建好的汽车。
4.5. 客户端代码:如何使用建造者模式
客户端代码通过创建一个具体的建造者(如 sportscarbuilder
),然后将它传递给指挥者 cardirector
,最终得到一个构建好的汽车。
class program { static void main(string[] args) { // 创建具体的建造者 icarbuilder carbuilder = new sportscarbuilder(); // 创建指挥者 cardirector director = new cardirector(carbuilder); // 指挥者构建汽车 car car = director.constructcar(); // 输出结果 console.writeline(car); } }
输出:
car [engine: v8 engine, wheels: 4, gps: true, sunroof: true]
在客户端中,我们通过 cardirector
来构建一个带有 v8 引擎、4 个轮子、gps 和天窗的运动型车。
五、建造者模式的优点与缺点
5.1. 优点
- 解耦产品的构建与表示:
- 建造者模式将对象的构建过程与最终的表示(对象的不同状态)分开,允许你独立于对象的具体表示方式构建复杂对象。
- 构建过程灵活:
- 同一个构建过程可以生成不同的产品。例如,你可以使用不同的建造者(如
sportscarbuilder
和suvcarbuilder
)来构建不同类型的汽车。
- 同一个构建过程可以生成不同的产品。例如,你可以使用不同的建造者(如
- 代码清晰、可维护:
- 每个具体建造者只负责构建特定类型的产品,避免了复杂的构造函数或多个参数的使用,使得代码结构更加清晰。
- 适合复杂产品的创建:
- 当对象的构建过程复杂,且各个部件之间有多种组合方式时,建造者模式非常适合。 5.2. 缺点
- 需要更多的类:
- 由于每个不同的建造者需要实现一个接口,并为每个产品提供具体实现,因此在产品种类很多时,可能会创建多个建造者类,导致类的数量增加。
- 不能直接使用“简单对象”:
- 对于一些简单的对象,使用建造者模式可能会显得有些“过度设计”,特别是当对象没有复杂的构建步骤时,简单的构造函数可能更为直接。
六、总结
建造者模式是一种非常有效的设计模式,它提供了一种灵活的方式来构建复杂对象。通过分解构建过程并将其与具体的表示分离,建造者模式能够创建不同类型的对象,同时保持代码的清晰性和可维护性。在 c# 中,建造者模式适用于复杂对象的构建、逐步配置以及需要灵活控制构建过程的场景。
总结关键点:
- 产品类:定义最终构建出来的复杂对象。
- 建造者接口:定义构建对象的步骤。
- 具体建造者:负责实现建造步骤并返回产品。
- 指挥者:负责控制构建过程的顺序,调用建造者进行具体操作。
如果你需要在 c# 中处理复杂对象的创建,并且对象的构建步骤可能变化,或者存在多个变种,建造者模式将是一个非常好的选择。
到此这篇关于c# 建造者模式(builder pattern)详细讲解的文章就介绍到这了,更多相关c# 建造者模式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论