Builder (建造者) — 【面向对象设计模式学习】

By CityWalker 2010年3月19日

Intent

Separate the construction of a complex object from its representation so that the same construction process can create different representations.

Applicability

有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出。

有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义。在某个性质没有赋值之前,另一个性质则无法赋值。这些情况使得性质本身的建造涉及到复杂的商业逻辑。

这时候,此对象相当于一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程就是组合零件的过程。由于组合零件的过程很复杂,因此,这些"零件"的组合过程往往被"外部化"到一个称作建造者的对象里,建造者返还给客户端的是一个全部零件都建造完毕的产品对象。

Structure

建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。

具体建造者(Concrete Builder)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:

a)         实现Builder角色提供的接口,一步一步完成创建产品实例的过程。

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

指导者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。

产品(Product)角色:产品便是建造中的复杂对象。

指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。

Example

以交通工具的制造为例,类图如下:

主要代码实现:

VehicleBuilder

public abstract class VehicleBuilder{protected Vehicle vehicle;public Vehicle VehicleInfo{get { return vehicle; }            }public abstract void BuildFrame();public abstract void BuildEngine();public abstract void BuildWheel();public abstract void BuildDoor();public abstract Vehicle GetProduct();}

Shop

public class Shop{public void Construct(VehicleBuilder vehicle){vehicle.BuildFrame();vehicle.BuildEngine();vehicle.BuildWheel();vehicle.BuildDoor();vehicle.GetProduct().Show();}}

Vehicle

public class Vehicle{private string type;private Hashtable parts = new Hashtable();public Vehicle(string type){this.type = type;}public object this[string key]{get { return parts[key]; }set { parts[key] = value; }}public void Show(){Console.WriteLine("-------------------");Console.WriteLine("Frame: " + parts["frame"]);Console.WriteLine("Engine: " + parts["engine"]);Console.WriteLine("Wheels: " + parts["wheels"]);Console.WriteLine("Doors: " + parts["doors"]);}}

MotorCycleBuilder

public class MotorCycleBuilder : VehicleBuilder{public override void BuildFrame(){vehicle = new Vehicle("MotorCycle");vehicle["frame"] = "MotorCycle Frame";}public override void BuildEngine(){vehicle["engine"] = "500 cc";}public override void BuildWheel(){vehicle["wheels"] = "2";}public override void BuildDoor(){vehicle["doors"] = "0";}public override Vehicle GetProduct(){return vehicle;}}

CarBuilder

public class CarBuilder : VehicleBuilder{public override void BuildFrame(){vehicle = new Vehicle("Car");vehicle["frame"] = "Car Frame";}public override void BuildEngine(){vehicle["engine"] = "2500cc";}public override void BuildWheel(){vehicle["wheels"] = "4";}public override void BuildDoor(){vehicle["doors"] = "4";}public override Vehicle GetProduct(){return vehicle;}}

Client:

static void Main(string[] args){VehicleBuilder builder = new CarBuilder();Shop shop = new Shop();shop.Construct(builder);Console.ReadKey();}

转载于:https://www.cnblogs.com/Reborn/archive/2010/03/20/1690327.html

Builder (建造者) — 【面向对象设计模式学习】相关推荐

  1. 开篇 — 【面向对象设计模式学习】

    说明: 关于设计模式的文章网上已经很多了,本人也只是想参考别人的文章来系统地学习一下设计模式,因此,这个系列并不是一个系列教程,而仅仅是作为本人学习设计模式的一个学习笔记,此外,由于本人能力有限,其中 ...

  2. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  3. 设计模式学习笔记汇总目录

    这里的学习笔记包含JavaSE和J2EE两部分,持续更新中! 其中关于学习的参考资料如下: 1.菜鸟设计模式 2.Head First Design Patterns(书.强烈推荐); 3.大话设计模 ...

  4. 设计模式学习笔记——建造者(Builder)模式

    设计模式学习笔记--建造者(Builder)模式 @(设计模式)[设计模式, 建造者模式, builder] 设计模式学习笔记建造者Builder模式 基本介绍 建造者案例 类图 实现代码 Build ...

  5. 设计模式学习(十一):Builder建造者模式

    一.什么是Builder模式 大都市中林立着许多高楼大厦,这些高楼大厦都是具有建筑结构的大型建筑.通常,建造和构建这种具有建筑结构的大型物体在英文中称为Build. 在建造大楼时,需要先打牢地基,搭建 ...

  6. 面向对象软件设计——设计模式学习

    工作也从开始C语言,转向现在的C++,表面上看得出,但实际中却没有把这种转变深入到思想中,究其原因还是对面向对象的软件设计不了解,有必要好好学习一下设计模式这个东东.本文就是设计模式学习第一篇-- 1 ...

  7. 学习C#面向对象设计模式纵横谈---笔记

    东西太多了.我比较侧重于实用,对理论性太强的东西,有种排斥的感觉. 先记着几点吧. Abstract Factory模式的几个要点:  如果没有应对:"多系列对象构建"的需求变化, ...

  8. 设计模式学习(四):基于Builder模式的歌词解析器

    一.前言 上篇文章(设计模式学习(三):生成器(Builder)模式)记录了 Builder 模式的具体内容,这次使用C语言来实现一个实际的例子--基于Builder模式的歌词解析器. 本文的示例来自 ...

  9. 36设计模式学习笔记

    设计模式学习笔记 文章目录 0.设计模式简介 1.单例模式 2.工厂方法 3.抽象工厂 4.责任链模式 5.模板方法 ok 一.模板方法简介 二.模式的定义和特点 三.模式的结构和实现 四.什么是模板 ...

最新文章

  1. java前台传多个id用什么接收_前端js传多个id 到java后台的处理方式
  2. SCOM2012部署系列之九:部署审核收集报告(ACSReporting)
  3. mysql port range_Defining port and port-range in /etc/services file
  4. CentOS7中设置.sh开机自启动(以后台启动geoserver为例)
  5. 加载gif动图_【知乎编辑技巧】GIF动图 的插入 2020.05
  6. Java 集合练习——3
  7. 甲骨文严查Java授权,企业连夜删除JDK
  8. 【OpenCV 例程200篇】62. 图像锐化——钝化掩蔽
  9. 基于特征的文法分析以及概述自然语言处理
  10. 【堆内存】动态图+代码五分钟轻松理解学会
  11. HDU 3695 Computer Virus on Planet Pandora (AC自己主动机)
  12. SLAM无人车通过上摄像头扫描二维码重定位
  13. Qt入门(1)——初识Qt
  14. 桌面支持--teamviwer如果没装杀毒软件,会有警告
  15. codeblocks解决网络方面错误undefined reference to `inet_ntoa@4'|
  16. 贴片电阻电容标称换算
  17. 武汉社保公积金常用信息汇总
  18. import math在python种中的意思,Python中import使用
  19. np.ravel()和np.flatten()
  20. 从0到1:朋友圈爆款背后的计算机视觉技术与应用 | 百万人学AI

热门文章

  1. Python入门之编程与编程语言
  2. python程序员总结的一些基本语法
  3. 如何链接两个名字一样动态库
  4. 关于学习Python的一点学习总结(18->序列解包)
  5. poj2409(纯Polya定理)
  6. java根据属性获取对象_java反射工具类--通过指定属性名,获取/设置对象属性值
  7. 【常用技巧精选】尺取法
  8. 225.用队列实现栈
  9. web服务器和应用服务器的区别以及负载均衡---学习笔记
  10. 【k8s最容易理解的科普】到底是什么 用处是什么