面向对象设计模式纵横谈:Builder 生成器模式(笔记记录)

时间:2023-01-06 08:36:32

Builder模式的缘起

假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分要富于变化。

如果使用最直观的设计方法,每一个房屋部分的变化,都将导致房屋构建的重新修正……

  
动机(Motivation)

在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?

意图(Intent)

将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。——《设计模式》GoF

结构(Structure)

面向对象设计模式纵横谈:Builder 生成器模式(笔记记录)

协作(Collaborations)

面向对象设计模式纵横谈:Builder 生成器模式(笔记记录)

游戏框架中的Builder应用

系统接口部分Builder

面向对象设计模式纵横谈:Builder 生成器模式(笔记记录)

Builder不需要关心具体的门是什么样子的,墙是什么样子的,它只是定义了轴线的东西。

系统相对稳定的部分Director

面向对象设计模式纵横谈:Builder 生成器模式(笔记记录)

系统相对变化的部分ConcreteBuilder

面向对象设计模式纵横谈:Builder 生成器模式(笔记记录)

Client

面向对象设计模式纵横谈:Builder 生成器模式(笔记记录)

Director和抽象类Builder是绑定的比较紧的,但是在它里面,没有任何具体ConcreteBuilder的任何信息。也就是说,Director不会被具体依赖所改变,当ConcreteBuilder改变时,Director不用变。

另外,客户端需要new一个ConcreteBuilder,当ConcreteBuilder改变时,这个程序还是需要改变Client。这里我们可以用一种动态的机制回避这种改变。我们可以从一个配置文件里面读取ConcreteBuilder具体类的名字,和程序集的名字,然后通过动态反射,让客户程序不发生任何依赖的改变。

面向对象设计模式纵横谈:Builder 生成器模式(笔记记录)

这样,当ConcreteBuilder需要改变的时候,只需要新增一个Builder的子类,修改一下配置文件就可以了。

这是非常符合开放封闭原则的,对扩展开放,对更改关闭。

这也符合依赖倒置原则。房屋的构建过程是一个高层抽象,房屋的具体实现细节依赖于高层抽象。高层抽象比较稳定,底层实现细节比较多变。

Builder模式的几个要点

Builder模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的算法(即Director,如上面例子中的GameManager),而复杂对象的各个部分(即ConcreteBuilder)则经常变化。

变化点在哪里,封装哪里——Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。(例如房屋构造如果经常改变,那么这个Builder模式也没有意义了)

AbstractFactory模式解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化。Builder模式通常和Composite模式组合使用。

.NET框架中的Builder应用

在ASP.Net中,我们在写一个Page类时,这个类继承自System.Web.UI.Page。Page其实就是一个Builder,它是一个容器。它有很多方法,就是所谓的BuilderPart()方法,例如:OnInit()、OnLoad()、OnPreRender()、Render()等,它们都是虚方法,我们都可以去重写,提供我们自己的实现。当我们编译到bin文件夹下的dll时,我们就生成了一个我们自己的ConcreteBuilder实例。实际上系统使用的是Page基类。

面向对象设计模式纵横谈:Builder 生成器模式(笔记记录)的更多相关文章

  1. 面向对象设计模式纵横谈:Singelton单件模式(笔记记录)

       李建忠老师讲的<面向对象设计模式纵横谈>,早就看过了,现在有了时间重新整理一下,以前的博客[赛迪网]没有了,现在搬到博客园,重新过一遍,也便于以后浏览. 设计模式从不同的角度分类会得 ...

  2. 设计模式03: Builder 生成器模式(创建型模式)

    Builder生成器模式(创建型模式) Builder模式缘起假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分富于变化.如果使用最直观的设计方法,每个房屋部分的变化,都将 ...

  3. C&num;面向对象设计模式纵横谈——1&period;面向对象设计模式与原则

    一:设计模式简介 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心. ---- Christopher Alexander 软件设计领域设计模式: 设计模式描述了软件设计过 ...

  4. 面向对象设计模式纵横谈:Bridge 桥接模式(笔记记录)

    桥接模式是一个比较难理解的设计模式,设计和分析的时候也不容易把握,咱们听听“李建忠”老师是怎么来讲的.我们还是从演变的角度来说问题,一步一步的来把问题说清楚.先谈谈“抽象”和“实现”的关系. 抽象与实 ...

  5. 设计模式(二): BUILDER生成器模式 -- 创建型模式

    1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...

  6. Java设计模式-Builder生成器模式

    概念: 生成器模式也称之为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,构建与产品分离. UML: Ibuild接口清晰地反映了创建产品Product的流程. 生成器模式涉及4个关键 ...

  7. 设计模式--Builder生成器模式

    如果文章中哪里有问题,希望各位大哥大姐指出,小弟十分感激. 正文 什么是生成器模式? 生成器模式就是把生产对象的过程进一步抽取.细化.独立.以往我们生产对象,可能就是在一个小作坊里面从头做到尾.现在用 ...

  8. 设计模式之&mdash&semi;&mdash&semi;Builder建造模式

    Builder模式又叫建造模式,是用于组装具有复杂结构的实例的模式. 示例程序是编写一个文档,并且写入到文件中,该文档具有以下结构,含有标题,字符串,一些条目. Builder抽象类,为建造模式的核心 ...

  9. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

随机推荐

  1. Windows Store App 全球化 设置指定页面的语言

    上一小节介绍了通过在应用程序中添加语言设置选项来改变整个应用显示信息的语言,而有时用户只想对应用中某一页面信息的语言进行调整,这时就不能使用上一小节所讲述的知识来对应用进行设置.下面将通过一个示例介绍 ...

  2. Buffalo最佳实践

    本文将介绍Buffalo AJAX的两种配置的最佳实践,这个AJAX框架还是中国大师开发的,用起来估计是最方便.最简单的一个 准备工作:官网下载buffalo-2.0-bin,也可以下载buffalo ...

  3. Nginx&plus;HTTPS&lpar;SSL&sol;TLS&rpar;

    环境 首先确保机器上安装了openssl和openssl-devel rpm -qa | grep openssl #yum install openssl #yum install openssl- ...

  4. 重构第19天 提取工厂类&lpar;Extract Factory Class&rpar;

    理解:本文中的“提取工厂类”是指如果要创建的对象很多,则代码会变的很复杂.一种很好的方法就是提取工厂类. 详解:一般来说我们需要在代码中设置一些对象,以便获得它们的状态,从而使用对象,所谓的设置通常来 ...

  5. 【转载】Visual Studio 2015 for Linux更好地支持Linux下的开发

    原文:Visual Studio 2015 for Linux更好地支持Linux下的开发 英文原文:Targeting Linux Made Easier in Visual Studio 2015 ...

  6. Android通过代码获取View

    View view = LayoutInflater.from(mContext).inflate(R.layout.song_item_adapter, null); LayoutInflater ...

  7. Android SDK 更新失败

    万恶的墙,调查兵团赶紧把墙拆了.大家一起跟巨人打一架. 解决方法是改hosts文件 添加 74.125.237.1 dl-ssl.google.com ok,good job 多亏了http://bl ...

  8. ThinkPHP函数详解:F方法

    我们已经了解了ThinkPHP中的S方法的用法,F方法其实是S方法的一个子集功能,仅用于简单数据缓存,并且只能支持文件形式,不支持缓存有效期,因为采用的是PHP返回方式,所以其效率较S方法较高,因此我 ...

  9. mysql for linux 数据库的安装过程

    mysql for linux 数据库的安装过程 l  安装版本:mysql-advanced-5.6.12-linux-glibc2.5-x86_64.tar.gz ,此版本是绿色版本,只需要将其解 ...

  10. Python:判断文本中的用户名在数据库中是否存在,存在返回1,不存在返回0

    下面是我写的python的一个小脚本,作用是:判断文本中的用户名在数据库中是否存在,存在返回1,不存在返回0.用的是MySQL数据库. 要注意的是:strip函数的使用,该函数的作用是去除字符串两端多 ...