程序技术好文:设计模式之美:Builder(生成器)

简介: 程序技术好文:设计模式之美:Builder(生成器)

索引


意图


结构


参与者


适用性


效果


相关模式


实现


实现方式(一):Builder 为每个构件定义一个操作。


实现方式(二):Builder 将构件返回给 Director,Director 将构件传递给 Builder 中的下一个步骤。


意图


将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


Separate the construction of a complex //代码效果参考:http://www.jhylw.com.cn/152021195.html

object from its representation so that the same construction process can create different representations.

结构


参与者


Builder


为创建一个 Product 对象的各个部件指定抽象接口。


ConcreteBuilder


实现 Builder 的接口以构造和装配该产品的各个部件。


定义并明确它所创建的表示。


提供一个检索产品的接口。


Director


构造一个使用 Builder 接口的对象。


Product


表示被构造的复杂对象。ConcreteBuilder 创建该产品的内部表示并定义它的装配过程。


包含定义组成部件的类,包括将这些部件装配成最终产品的接口。


适用性


在以下情况下可以使用 Builder 模式:


当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。


当构造过程必须允许被构造的对象有不同的表示时。


效果


它使你可以改变一个产品的内部表示。在改变该产品的内部表示时所要做的只是定义一个新的 ConcreteBuilder。


它将构造代码和表示代码分开,提高了对象的模块性。客户不需要知道定义产品内部结构的类的所有信息。


它使你可以对构造过程进行更精细的控制。对象是在 Director 的控制下一步一步构造的,仅当产品构造完成时 Director 才从 Builder 中取回它。


相关模式


Abstract Factory 和 Builder 相似,因为它也可以创建复杂对象。区别是 Builder 着重于一步步构造一个复杂对象。而 Abstract Factory 着重于多个系列的产品对象(或简单或复杂)。Builder 是在最后一步返回产品,Abstract Factory 是立即返回。


Composite 通常是//代码效果参考:http://www.jhylw.com.cn/184520175.html

用 Builder 生成的。

实现


实现方式(一):Builder 为每个构件定义一个操作。


通常有一个抽象的 Builder 类为 Director 可能要求创建的每一个 "构件" 定义一个操作。这些操作默认情况下什么都不做。一个 ConcreteBuilder 类对它感兴趣的 "构件" 对应的操作进行重定义。


1 namespace BuilderPattern.Implementation1


2 {


3 public class ComplexProduct


4 {


5 public string ValueDependOnWeather { get; set; }


6 public string ValueDependOnFortune { get; set; }


7 }


8


9 public abstract class AbstractComplexProductBuilder


10 {


11 protected ComplexProduct _complexProduct;


12


13 public void BeginBuild(ComplexProduct existingComplexProduct = null)


14 {


15 if (existingComplexProduct == null)


16 _complexProduct = new ComplexProduct();


17 else


18 _complexProduct = existingComplexProduct;


19 }


20


21 public virtual void BuildValueDependOnWeatherPart(string weather)


22 {


23 // could do nothing by default


24 _complexProduct.ValueDependOnWeather = weather;


25 }


26


27 public virtual void BuildValueDependOnFortunePart(string luck)


28 {


29 // could do nothing by default


30 _complexProduct.ValueDependOnFortune = luck;


31 }


32


33 public ComplexProduct EndBuild()


34 {


35 return this._complexProduct;


36 }


37 }


38


39 public class ConcreteProductBuilderA : AbstractComplexProductBuilder


40 {


41 private string _dayOfWeek;


42 private int _luckyNumber;


43


44 public ConcreteProductBuilderA(string dayOfWeek, int luckyNumber)


45 {


46 _dayOfWeek = dayOfWeek;


47 _luckyNumber = luckyNumber;


48 }


49


50 public override void BuildValueDependOnWeatherPart(string weather)


51 {


52 // something customized


53 _complexProduct.ValueDependOnWeather = _dayOfWeek + " is " + weather;


54 }


55


56 public override void BuildValueDependOnFortunePart(string luck)


57 {


58 // something customized


59 if (_luckyNumber == 8)


60 _complexProduct.ValueDependOnFortune = "Supper" + luck;


61 else


62 _complexProduct.ValueDependOnFortune = "Just so so" + luck;


63 }


64 }


65


66 public class GoodWeatherAndGoodLuckDirector


67 {


68 public void ConstructWithGoodWeatherAndGoodLuck(AbstractComplexProductBuilder builder)


69 {


70 builder.BuildValueDependOnWeatherPart(@"PM2.5 < 50");


71 builder.BuildValueDependOnFortunePart(@"Good Luck");


72 }


73


74 public void ConstructWithBadWeatherAndBadLuck(AbstractComplexProductBuilder builder)


75 {


76 builder.BuildValueDependOnWeatherPart(@"PM2.5 > 500");


77 builder.BuildValueDependOnFortunePart(@"Bad Luck");


78 }


79 }


80


81 public class Client


82 {


83 public void TestCase1()


84 {


85 AbstractComplexProductBuilder builder = new ConcreteProductBuilderA("Sunday", 9);


86 GoodWeatherAndGoodLuckDirector director = new GoodWeatherAndGoodLuckDirector();


87


88 builder.BeginBuild();


89 director.ConstructWithGoodWeatherAndGoodLuck(builder);


90 ComplexProduct productWithGoodLuck = builder.EndBuild();


91


92 builder.BeginBuild();


93 director.ConstructWithBadWeatherAndBadLuck(builder);


94 ComplexProduct productWithBadLuck = builder.EndBuild();


95 }


96 }


97 }


实现方式(二):Builder 将构件返回给 Director,Director 将构件传递给 Builder 中的下一个步骤。


Builder 逐步的构造产品,所以其接口必须足够的普遍。如果构造过程中需要访问前面已经构造了的产品构件,则 Builder 将构件返回给 Director,由 Director 将构件传递给 Builder 中的下一个步骤。


1 namespace BuilderPattern.Implementation2


2 {


3 public class ComplexProduct


4 {


5 public string ValueDependOnWeather { get; set; }


6 public string ValueDependOnFortune { get; set; }


7 }


8


9 public abstract class AbstractComplexProductBuilder


10 {


11 protected ComplexProduct _complexProduct;


12


13 public void BeginBuild(ComplexProduct existingComplexProduct = null)


14 {


15 if (existingComplexProduct == null)


16 _complexProduct = new ComplexProduct();


17 else


18 _complexProduct = existingComplexProduct;


19 }


20


21 public virtual string BuildValueDependOnWeatherPart(string weather)


22 {


23 // could do nothing by default


24 _complexProduct.ValueDependOnWeather = weather;


25 return _complexProduct.ValueDependOnWeather;


26 }


27


28 public virtual string BuildValueDependOnFortunePart(string luck, string combinedWithWeather)


29 {


30 // could do nothing by default


31 _complexProduct.ValueDependOnFortune = luck + combinedWithWeather;


32 return _complexProduct.ValueDependOnFortune;


33 }


34


35 public ComplexProduct EndBuild()


36 {


37 return this._complexProduct;


38 }


39 }


40


41 public class ConcreteProductBuilderA : AbstractComplexProductBuilder


42 {


43 private string _dayOfWeek;


44 private int _luckyNumber;


45


46 public ConcreteProductBuilderA(string dayOfWeek, int luckyNumber)


47 {


48 _dayOfWeek = dayOfWeek;


49 _luckyNumber = luckyNumber;


50 }


51


52 public override string BuildValueDependOnWeatherPart(string weather)


53 {


54 // something customized


55 _complexProduct.ValueDependOnWeather = _dayOfWeek + " is " + weather;


56 return _complexProduct.ValueDependOnWeather;


57 }


58


59 public override string BuildValueDependOnFortunePart(string luck, string combinedWithWeather)


60 {


61 // something customized


62 if (_luckyNumber == 8)


63 _complexProduct.ValueDependOnFortune = "Supper" + luck + combinedWithWeather;


64 else


65 _complexProduct.ValueDependOnFortune = "Just so so" + luck + combinedWithWeather;


66 return _complexProduct.ValueDependOnFortune;


67 }


68 }


69


70 public class GoodWeatherAndGoodLuckDirector


71 {


72 public void<span style="color: rgba(0, 0, 0, 1

相关文章
|
2月前
|
设计模式 Java
「全网最细 + 实战源码案例」设计模式——生成器模式
生成器模式(Builder Pattern)是一种创建型设计模式,用于分步骤构建复杂对象。它允许用户通过控制对象构造的过程,定制对象的组成部分,而无需直接实例化细节。该模式特别适合构建具有多种配置的复杂对象。其结构包括抽象建造者、具体建造者、指挥者和产品角色。适用于需要创建复杂对象且对象由多个部分组成、构造过程需对外隐藏或分离表示与构造的场景。优点在于更好的控制、代码复用和解耦性;缺点是增加复杂性和不适合简单对象。实现时需定义建造者接口、具体建造者类、指挥者类及产品类。链式调用是常见应用方式之一。
64 12
|
6月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
7月前
|
设计模式 物联网 Android开发
移动应用与系统:探索未来技术的融合之路后端开发中的设计模式探索
【8月更文挑战第21天】随着科技的飞速发展,移动应用和操作系统已经成为我们日常生活中不可或缺的一部分。本文将深入探讨移动应用开发和移动操作系统的相关话题,包括它们的历史、现状以及未来的发展趋势。我们将从移动应用的开发环境、编程语言和工具等方面进行详细的分析,同时也会讨论移动操作系统的特点、优势以及面临的挑战。最后,我们将展望移动应用与系统在未来技术融合中的可能方向和机遇。
144 58
|
7月前
|
设计模式 项目管理
设计模式的基础问题之生成器模式在项目管理应用的问题如何解决
设计模式的基础问题之生成器模式在项目管理应用的问题如何解决
|
8月前
|
C++ 设计模式
iLogtail设计模式问题之生成器模式的Product(产品)角色是什么
iLogtail设计模式问题之生成器模式的Product(产品)角色是什么
|
8月前
|
设计模式 安全 Java
技术成神之路:设计模式(一)单例模式
【7月更文挑战第3天】技术成神之路:设计模式(一)单例模式
54 1
|
9月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
9月前
|
设计模式 Java API
程序技术好文:设计模式:装饰者模式
程序技术好文:设计模式:装饰者模式
39 0
|
9月前
|
设计模式 网络协议 Java
技术笔记:Reactor设计模式
技术笔记:Reactor设计模式
81 0
|
8天前
|
设计模式 Java 关系型数据库
设计模式:工厂方法模式(Factory Method)
工厂方法模式是一种创建型设计模式,通过将对象的创建延迟到子类实现解耦。其核心是抽象工厂声明工厂方法返回抽象产品,具体工厂重写该方法返回具体产品实例。适用于动态扩展产品类型、复杂创建逻辑和框架设计等场景,如日志记录器、数据库连接池等。优点包括符合开闭原则、解耦客户端与具体产品;缺点是可能增加类数量和复杂度。典型应用如Java集合框架、Spring BeanFactory等。