程序技术好文:设计模式之美: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

相关文章
|
4月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
6月前
|
设计模式 前端开发 数据库
深入理解MVC设计模式:构建高效Web应用程序的基石
【7月更文挑战第4天】在软件工程领域,设计模式是解决常见问题的一系列经过验证的方法。其中,Model-View-Controller(MVC)设计模式自诞生以来,便成为了构建用户界面,特别是Web应用程序的黄金标准。MVC通过将应用程序逻辑分离为三个核心组件,提高了代码的可维护性、可扩展性和重用性。本文将深入探讨MVC设计模式的原理,并通过一个简单的代码示例展示其应用。
251 0
|
5月前
|
设计模式 物联网 Android开发
移动应用与系统:探索未来技术的融合之路后端开发中的设计模式探索
【8月更文挑战第21天】随着科技的飞速发展,移动应用和操作系统已经成为我们日常生活中不可或缺的一部分。本文将深入探讨移动应用开发和移动操作系统的相关话题,包括它们的历史、现状以及未来的发展趋势。我们将从移动应用的开发环境、编程语言和工具等方面进行详细的分析,同时也会讨论移动操作系统的特点、优势以及面临的挑战。最后,我们将展望移动应用与系统在未来技术融合中的可能方向和机遇。
137 58
|
4月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
4月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
6月前
|
设计模式 安全 Java
技术成神之路:设计模式(一)单例模式
【7月更文挑战第3天】技术成神之路:设计模式(一)单例模式
48 1
|
7月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
7月前
|
设计模式 Java API
程序技术好文:设计模式:装饰者模式
程序技术好文:设计模式:装饰者模式
32 0
|
7月前
|
设计模式 网络协议 Java
技术笔记:Reactor设计模式
技术笔记:Reactor设计模式
72 0
|
21天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    64
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    54
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    61
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    79
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    47
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    81
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    70
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    54
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    63
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    137