設計模式之建造者模式

 

建造者模式簡介

 建造者模式又稱生成器模式,它將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。這就要求,咱們所要處理的對象必需要有很是強的結構化特徵,對於開發人員而言,須要抽象出通常的結構化接口出來,方便進行構建工做。 html

做爲一名碼農,最可貴的應該就是找對象了,就算勉強找到了,要是對人家很差,人家可就離你遠去了。因此要對人家好點,學會作飯,多弄幾個花樣出來,讓生活充滿新鮮感,小兩口的感情也會愈來愈深了。ide

這個時候建造者模式就閃亮登場了,咱們所吃的飯,無非是炒菜,主食,另外還須要弄湯類或者飲料類東西,只要將這些東西抽象出來,那麼天天的飯菜內容就穩定了,永遠變化的是具體的炒菜品類、主食品類和湯的品類。要始終謹記,穩定的東西都是抽象後的東西,不要一會兒就陷入到細節中去。ui

建造者模式UML類圖

jianzaozhe

經過UML類圖,咱們能夠知道建造者模式有如下幾個角色:this

Director:從抽象角度建立對象的各個部分,同時根據要求設計建立各個部分的順序。spa

Builder:給出一個抽象接口,以規範產品對象的各個組成部分的建造。設計

ConcreteBuilder:實現Builder接口,具體化建立對象的各個部分。 並提供具體的實例。3d

Product:要建立的複雜對象。此處指的是Meal。固然該類能夠不用,只保留概念也是能夠的。code

範例

接下來的範例就是要爲女友準備不一樣的飯菜,以達生活新鮮感的目的,要好好學哦。htm

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

調用對象

   1:  class Program
   2:  {
   3:      static void Main(string[] args)
   4:      {
   5:          Builder builder = new BreakfastBuilder();
   6:          Director director = new Director(builder);
   7:          director.Construct("八寶粥","香菇青菜","番茄雞蛋湯");
   8:   
   9:          Meal meal = builder.MealBuilder();
  10:   
  11:          meal.Show("親,吃早餐啦");
  12:          Console.Read();
  13:      }
  14:  }

運行結果:

1555851789(1)

固然,我這早餐,估計不過關的機率十分的大。

建造者模式優缺點

優勢:

一、建造者模式有更好的封裝性和細節隱藏的特色,調用者無需也沒法關注到細節部分。

二、因爲建造者對對象自己以及建立過程進行了很是細緻的拆分,使得咱們能夠精細控制細節部分,減小風險。

 

缺點:

一、若是內部很是複雜的話,會生成太多太多的類,以致於會擴大咱們的關注點,加大了代碼的維護難度。

二、因爲建造者模式自己很複雜,因此咱們須要將建造者模式應用於經過環境下,否則只爲了一種場景編寫,實在是耗費精力,這也就帶來了建造模式的使用範圍。

建造者模式使用範圍的思考

建造者模式要求咱們使用抽象思惟來面對問題,其建造過程與表示分離是其最大特徵,若是建造過程可變,同時具備高度的結構化,咱們使用建造者模式是很是有幫助的。

關於表示的功能,咱們能夠理解爲,只是一個抽象接口,可是因爲咱們能夠改變其構建順序或者選擇構建結構,使得表示能夠多樣化,此刻咱們使用建造者模式也是有益的。

相關文章
相關標籤/搜索