建造者模式可以将部件本身和它们的组装过程分开,关注如何一步步创建一个包含多个组成部分的复杂对象,用户只需要指定复杂对象的类型即可得到该对象,而无须知道其内部的具体构造细节。

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

建造者模式的定义:

将客户端与包含多个部件的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可;

关注如何逐步创建一个复杂的对象,不同的建造者定义了不同的创建过程;

建造者模式的结构:

建造者模式包含以下4个角色:

Builder(抽象建造者)

ConcreteBuilder(具体建造者)

Product(产品)

Director(指挥者)

例子:

  1. /// <summary>
  2. /// 抽象建造者
  3. /// </summary>
  4. public abstract class Builder
  5. {
  6. public abstract void BuilderPartA();
  7. public abstract void BuilderPartB();
  8. public abstract void BuilderPartC();
  9.  
  10. /// <summary>
  11. /// //创建产品对象
  12. /// </summary>
  13. protected Product product = new Product();
  14. /// <summary>
  15. /// 返回产品对象
  16. /// </summary>
  17. /// <returns></returns>
  18. public Product GetResult()
  19. {
  20. return product;
  21. }
  22. }
  1. /// <summary>
  2. /// 产品类
  3. /// </summary>
  4. public class Product
  5. {
  6. //生产的产品
  7. public string PartA { get; set; }
  8. public string PartB { get; set; }
  9. public string PartC { get; set; }
  10. }
  1. /// <summary>
  2. /// 具体建造者
  3. /// </summary>
  4. public class ConcreteBuilder:Builder
  5. {
  6. /// <summary>
  7. /// 产品A
  8. /// </summary>
  9. public override void BuilderPartA()
  10. {
  11. product.PartA = "A1";
  12. Console.WriteLine("生产了A1产品");
  13. }
  14. /// <summary>
  15. /// 产品B
  16. /// </summary>
  17. public override void BuilderPartB()
  18. {
  19. product.PartB = "B1";
  20. Console.WriteLine("生产了B1产品");
  21. }
  22. /// <summary>
  23. /// 产品C
  24. /// </summary>
  25. public override void BuilderPartC()
  26. {
  27. product.PartC = "C1";
  28. Console.WriteLine("生产了C1产品");
  29. }
  30. }
  1. /// <summary>
  2. /// 指挥者
  3. /// </summary>
  4. public class Director
  5. {
  6. private Builder _builder;
  7. public Director(Builder builder)
  8. {
  9. this._builder = builder;
  10. }
  11. public void SetBuilder(Builder builder)
  12. {
  13. this._builder = builder;
  14. }
  15. /// <summary>
  16. /// 产品构建与组装方法
  17. /// </summary>
  18. /// <returns></returns>
  19. public Product Construct()
  20. {
  21. _builder.BuilderPartA();
  22. _builder.BuilderPartB();
  23. _builder.BuilderPartC();
  24. return _builder.GetResult();
  25. }
  26. }
  1. //客户端调用
  2. Builder builder = new ConcreteBuilder();
  3. Director director = new Director(builder);
  4. Product product = director.Construct();

游戏不同角色案例:

  1. /// <summary>
  2. /// 游戏角色建造者,充当抽象建造者
  3. /// </summary>
  4. public abstract class ActorBuilder
  5. {
  6. public abstract void BuildType();
  7. public abstract void BuildSex();
  8. public abstract void BuildFace();
  9. public abstract void BuildCostume();
  10. public abstract void BuildHairstyle();
  11.  
  12. protected Actor actor = new Actor();
  13. /// <summary>
  14. /// 工厂方法,返回一个完整的游戏角色对象
  15. /// </summary>
  16. /// <returns></returns>
  17. public Actor CreateActor()
  18. {
  19. return actor;
  20. }
  21. }
  1. /// <summary>
  2. /// 游戏角色类,充当复杂产品对象
  3. /// </summary>
  4. public class Actor
  5. {
  6. /// <summary>
  7. /// 角色类型
  8. /// </summary>
  9. public string Type { get; set; }
  10. /// <summary>
  11. /// 性别
  12. /// </summary>
  13. public string Sex { get; set; }
  14. /// <summary>
  15. /// 面容
  16. /// </summary>
  17. public string Face { get; set; }
  18. /// <summary>
  19. /// 服装
  20. /// </summary>
  21. public string Costume { get; set; }
  22. /// <summary>
  23. /// 发型
  24. /// </summary>
  25. public string Hairstyle { get; set; }
  26. }
  1. /// <summary>
  2. /// 英雄角色建造者,充当具体建造者
  3. /// </summary>
  4. public class Hero : ActorBuilder
  5. {
  6. public override void BuildType()
  7. {
  8. actor.Type = "英雄";
  9. }
  10.  
  11. public override void BuildSex()
  12. {
  13. actor.Sex = "男";
  14. }
  15.  
  16. public override void BuildFace()
  17. {
  18. actor.Face = "英俊";
  19. }
  20.  
  21. public override void BuildCostume()
  22. {
  23. actor.Costume = "盔甲";
  24. }
  25.  
  26. public override void BuildHairstyle()
  27. {
  28. actor.Hairstyle = "飘逸";
  29. }
  30. }
  1. /// <summary>
  2. /// 天使角色建造者,充当具体建造者
  3. /// </summary>
  4. public class Angel : ActorBuilder
  5. {
  6. public override void BuildType()
  7. {
  8. actor.Type = "天使";
  9. }
  10.  
  11. public override void BuildSex()
  12. {
  13. actor.Sex = "女";
  14. }
  15.  
  16. public override void BuildFace()
  17. {
  18. actor.Face = "漂亮";
  19. }
  20.  
  21. public override void BuildCostume()
  22. {
  23. actor.Costume = "白裙";
  24. }
  25.  
  26. public override void BuildHairstyle()
  27. {
  28. actor.Hairstyle = "披肩长发";
  29. }
  30. }
  1. /// <summary>
  2. /// 角色控制器,充当指挥者
  3. /// </summary>
  4. public class ActorController
  5. {
  6. /// <summary>
  7. /// 逐步构建复杂产品对象
  8. /// </summary>
  9. /// <param name="ab"></param>
  10. /// <returns></returns>
  11. public Actor Construct(ActorBuilder ab)
  12. {
  13. ab.BuildType();
  14. ab.BuildSex();
  15. ab.BuildFace();
  16. ab.BuildCostume();
  17. ab.BuildHairstyle();
  18. Actor actor = ab.CreateActor();
  19. return actor;
  20. }
  21. }
  1. <configuration>
  2. <startup>
  3. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  4. </startup>
  5. <appSettings>
  6. <add key="builder" value="ConsoleApplication1.Angel"/>
  7. </appSettings>
  8. </configuration>

客户端调用:

  1. //通过读取配置文件创建对象
  2. string builderType = ConfigurationManager.AppSettings["builder"];
  3. ActorBuilder _actor = (ActorBuilder)Assembly.Load("ConsoleApplication1").CreateInstance(builderType);
  4. //直接创建对象
  5. //ActorBuilder _actor = new Angel();// new Hero();
  6. ActorController actorController = new ActorController();
  7. //生产后返回对象实体
  8. Actor actor = actorController.Construct(_actor);
  9. Console.WriteLine(actor.Type);
  10. Console.WriteLine(actor.Sex);
  11. Console.WriteLine(actor.Face);
  12. Console.WriteLine(actor.Costume);
  13. Console.WriteLine(actor.Hairstyle);
  14. Console.ReadKey();

C#设计模式之建造者模式的更多相关文章

  1. Java设计模式之建造者模式(Builder)

    前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...

  2. C#设计模式(5)——建造者模式(Builder Pattern)

    一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...

  3. 【GOF23设计模式】建造者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...

  4. C++设计模式之建造者模式(三)

    4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...

  5. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  6. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  7. C#设计模式之四建造者模式(Builder Pattern)【创建型】

    一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...

  8. Java 设计模式之建造者模式(四)

    原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...

  9. GOF23设计模式之建造者模式

    GOF23设计模式之建造者模式 场景: 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样的一个问题需要处理: 装配这些子组件是不是有个步骤问题? 实际开发中,我们所 ...

  10. java设计模式3——建造者模式

    java设计模式3--建造者模式 1.建造者模式介绍: 建造者模式属于创建型模式,他提供了一种创建对象得最佳方式 定义: 将一个复杂对象的构建和与它的表示分离,使得同样的构建过程可以创建不同的表示 主 ...

随机推荐

  1. PHPstorm同步文件时与ftp断开连接

    一用PHPstorm同步对比服务器端和本地文件的差异时,一会就断开ftp再也连不上了,弄了好久终于找到原因了,好像这个同步会频繁请求建立连接,服务器本地安全策略屏蔽了ip,还是下载后再做修改或者直接在 ...

  2. Codeforces Round #384 (Div. 2) B. Chloe and the sequence(规律题)

    传送门 Description Chloe, the same as Vladik, is a competitive programmer. She didn't have any problems ...

  3. http请求与响应(content-type)

    http请求信息由浏览器把地址栏URL信息和页面(html.jsp.asp)组装成http请求消息体(如下). <request-line>(请求消息行)<headers>(请 ...

  4. pandas read table

    http://pandas.pydata.org/pandas-docs/stable/10min.html import pandas as pd res = pd.read_table(" ...

  5. Hibernate组件和关联映射

    一.基本定义 组件:建立一个类,为了方便代码复用和建立模型,但类在数据库中并没有对应的表,此类可以作为一个组件插入到其他类中(有数据表的类) 组件和关联映射的关系是组件是没有对应的类;组件是值类型的, ...

  6. Linux学习之CentOS(二十一)--Linux系统启动详解

      在这篇随笔里面将对Linux系统的启动进行一个详细的解释!我的实验机器是CentOS6.4,当然对于现有的Linux发行版本,其系统的启动基本上都是一样的! 首先我们来看下Linux系统启动的几个 ...

  7. MVC防止xss攻击 ——Html.AntiForgeryToken的AJAX提交

    1.在Html表单里面使用了@Html.AntiForgeryToken()就可以阻止CSRF攻击. 2.相应的我们要在Controller中也要加入[ValidateAntiForgeryToken ...

  8. Android中仿IOS提示框的实现

    前言 在Android开发中,我们有时需要实现类似IOS的对话框.今天我就来总结下,如何通过自定义的开发来实现类似的功能. 自定义Dialog 我们知道Android中最常用的对话框就是Dialog及 ...

  9. volatile关键字 学习记录1

    虽然已经工作了半年了...虽然一直是在做web开发....但是平时一直很少使用多线程..... 然后最近一直在看相关知识..所以就有了这篇文章 用例子来说明问题吧 public class Volat ...

  10. 关于在Xcode控制台打印的注意点

    注意!!在控制台中打印语句的返回值,这句代码也算是被执行过了一次 比如在下列代码的if语句执行之前,现在控制台打印 [_dataBaseexecuteUpdate:createSql] 的布尔值 if ...