前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之建造者模式

设计模式之建造者模式

作者头像
Edison.Ma
发布2019-07-19 18:30:57
5040
发布2019-07-19 18:30:57
举报
文章被收录于专栏:DotNet Core圈圈DotNet Core圈圈

建造者模式简介

建造者模式又称生成器模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这就要求,我们所要处理的对象必须要有非常强的结构化特征,对于开发人员而言,需要抽象出一般的结构化接口出来,方便进行构建工作。

作为一名码农,最难得的应该就是找对象了,就算勉强找到了,要是对人家不好,人家可就离你远去了。所以要对人家好点,学会做饭,多弄几个花样出来,让生活充满新鲜感,小两口的感情也会越来越深了。

这个时候建造者模式就闪亮登场了,我们所吃的饭,无非是炒菜,主食,另外还需要弄汤类或者饮料类东西,只要将这些东西抽象出来,那么每天的饭菜内容就稳定了,永远变化的是具体的炒菜品类、主食品类和汤的品类。要始终谨记,稳定的东西都是抽象后的东西,不要一下子就陷入到细节中去。

建造者模式UML类图

通过UML类图,我们可以知道建造者模式有以下几个角色:

Director:从抽象角度创建对象的各个部分,同时根据要求设计创建各个部分的顺序。 Builder:给出一个抽象接口,以规范产品对象的各个组成部分的建造。 ConcreteBuilder:实现Builder接口,具体化创建对象的各个部分。并提供具体的实例。 Product:要创建的复杂对象。此处指的是Meal。当然该类可以不用,只保留概念也是可以的。

范例

接下来的范例就是要为女朋友准备不同的饭菜,以达生活新鲜感的目的,要好好学哦。

代码语言:javascript
复制
   1:  public class Meal
代码语言:javascript
复制
   2:  {
代码语言:javascript
复制
   3:      private string mainMeal;
代码语言:javascript
复制
   4:      private string stirFry;
代码语言:javascript
复制
   5:      private string soup;
代码语言:javascript
复制
   6:   
代码语言:javascript
复制
   7:      public Meal(string mainMeal, string stirFry, string soup)
代码语言:javascript
复制
   8:      {
代码语言:javascript
复制
   9:          this.mainMeal = mainMeal;
代码语言:javascript
复制
  10:          this.stirFry = stirFry;
代码语言:javascript
复制
  11:          this.soup = soup;
代码语言:javascript
复制
  12:      }
代码语言:javascript
复制
  13:   
代码语言:javascript
复制
  14:      public void Show(string mealType)
代码语言:javascript
复制
  15:      {
代码语言:javascript
复制
  16:          Console.WriteLine(mealType);
代码语言:javascript
复制
  17:   
代码语言:javascript
复制
  18:          Console.WriteLine("主食:" + this.mainMeal);
代码语言:javascript
复制
  19:          Console.WriteLine("菜类:" + this.stirFry);
代码语言:javascript
复制
  20:          Console.WriteLine("汤类:" + this.soup);
代码语言:javascript
复制
  21:      }
代码语言:javascript
复制
  22:  }
代码语言:javascript
复制
  23:   
代码语言:javascript
复制
  24:  public abstract class Builder
代码语言:javascript
复制
  25:  {
代码语言:javascript
复制
  26:      public abstract void BuildMainMeal(string mainMeal);
代码语言:javascript
复制
  27:   
代码语言:javascript
复制
  28:      public abstract void BuildStirFry(string stirFry);
代码语言:javascript
复制
  29:   
代码语言:javascript
复制
  30:      public abstract void BuildSoup(string soup);
代码语言:javascript
复制
  31:   
代码语言:javascript
复制
  32:      public abstract Meal MealBuilder();
代码语言:javascript
复制
  33:  }
代码语言:javascript
复制
  34:   
代码语言:javascript
复制
  35:  public class BreakfastBuilder : Builder
代码语言:javascript
复制
  36:  {
代码语言:javascript
复制
  37:      private string mainMeal;
代码语言:javascript
复制
  38:      private string stirFry;
代码语言:javascript
复制
  39:      private string soup;
代码语言:javascript
复制
  40:   
代码语言:javascript
复制
  41:      public override void BuildMainMeal(string mainMeal)
代码语言:javascript
复制
  42:      {
代码语言:javascript
复制
  43:          this.mainMeal = mainMeal;
代码语言:javascript
复制
  44:      }
代码语言:javascript
复制
  45:   
代码语言:javascript
复制
  46:      public override void BuildStirFry(string stirFry)
代码语言:javascript
复制
  47:      {
代码语言:javascript
复制
  48:          this.stirFry = stirFry;
代码语言:javascript
复制
  49:      }
代码语言:javascript
复制
  50:   
代码语言:javascript
复制
  51:      public override void BuildSoup(string soup)
代码语言:javascript
复制
  52:      {
代码语言:javascript
复制
  53:          this.soup = soup;
代码语言:javascript
复制
  54:      }
代码语言:javascript
复制
  55:   
代码语言:javascript
复制
  56:      public override Meal MealBuilder()
代码语言:javascript
复制
  57:      {
代码语言:javascript
复制
  58:          return new Meal(mainMeal, stirFry, soup);
代码语言:javascript
复制
  59:      }
代码语言:javascript
复制
  60:  }
代码语言:javascript
复制
  61:   
代码语言:javascript
复制
  62:  public class Director
代码语言:javascript
复制
  63:  {
代码语言:javascript
复制
  64:      private Builder builder;
代码语言:javascript
复制
  65:      public Director(Builder builder)
代码语言:javascript
复制
  66:      {
代码语言:javascript
复制
  67:          this.builder = builder;
代码语言:javascript
复制
  68:      }
代码语言:javascript
复制
  69:   
代码语言:javascript
复制
  70:      public void Construct(string mainMeal, string stirFry, string soup)
代码语言:javascript
复制
  71:      {
代码语言:javascript
复制
  72:          builder.BuildMainMeal(mainMeal);
代码语言:javascript
复制
  73:          builder.BuildStirFry(stirFry);
代码语言:javascript
复制
  74:          builder.BuildSoup(soup);
代码语言:javascript
复制
  75:      }
代码语言:javascript
复制
  76:  }

调用

代码语言:javascript
复制
   1:  class Program
代码语言:javascript
复制
   2:  {
代码语言:javascript
复制
   3:      static void Main(string[] args)
代码语言:javascript
复制
   4:      {
代码语言:javascript
复制
   5:          Builder builder = new BreakfastBuilder();
代码语言:javascript
复制
   6:          Director director = new Director(builder);
代码语言:javascript
复制
   7:          director.Construct("八宝粥","香菇青菜","番茄鸡蛋汤");
代码语言:javascript
复制
   8:   
代码语言:javascript
复制
   9:          Meal meal = builder.MealBuilder();
代码语言:javascript
复制
  10:   
代码语言:javascript
复制
  11:          meal.Show("亲,吃早餐啦");
代码语言:javascript
复制
  12:          Console.Read();
代码语言:javascript
复制
  13:      }
代码语言:javascript
复制
  14:  }

运行结果:

当然,我这早餐,估计不过关的概率十分的大。

建造者模式优缺点

优点: 1、建造者模式有更好的封装性和细节隐藏的特点,调用者无需也无法关注到细节部分。 2、由于建造者对对象本身以及创建过程进行了非常细致的拆分,使得我们可以精细控制细节部分,减少风险。 缺点: 1、如果内部非常复杂的话,会生成太多太多的类,以至于会扩大我们的关注点,加大了代码的维护难度。 2、由于建造者模式本身很复杂,所以我们需要将建造者模式应用于通过环境下,不然只为了一种场景编写,实在是耗费精力,这也就带来了建造模式的使用范围。

建造者模式使用范围的思考

建造者模式要求我们使用抽象思维来面对问题,其建造过程与表示分离是其最大特征,如果建造过程可变,同时具有高度的结构化,我们使用建造者模式是非常有帮助的。 关于表示的功能,我们可以理解为,只是一个抽象接口,但是由于我们可以改变其构建顺序或者选择构建结构,使得表示可以多样化,此刻我们使用建造者模式也是有益的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet技术平台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 建造者模式简介
  • 建造者模式UML类图
  • 范例
  • 建造者模式优缺点
  • 建造者模式使用范围的思考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档