1. 程式人生 > >設計模式之禪之建立類PK【工廠模式VS建造者模式】

設計模式之禪之建立類PK【工廠模式VS建造者模式】

設計模式之禪PK之建立類

建立類設計模式

  • 建立類模式:
    • 工廠方法模式
    • 建造者模式
    • 抽象工廠模式
    • 單例模式
    • 原型模式
  • 建立者模式的功能:
    • 提供物件的建立和管理職責
    • 工廠方法模式、抽象工廠方法模式、建造者模式他們之間有較多的相似性,容易混淆
    • 單例模式是要保持在記憶體中只有一個物件;原型模式是要通過複製的方式產生一個新的物件

【工廠模式】VS【建造者模式】

  • 對比
    • 工廠方法模式:注重的是整體物件的建立
    • 建造者模式:注重是部件構建的過程,旨在通過一步步地精確構造創建出一個複雜的物件
  • 舉例簡單說明
    • 假如要製造一個超人
      • 工廠方法模式:直接產生出來的就是一個力大無窮、能夠飛翔、內褲外穿的超人
      • 建造者模式:組裝手、頭、腳、軀幹等部分,然後再把內褲外穿
  • 具體通過邏輯來PK
比較內容 工廠方法模式生產超人 建造者模式組裝超人
類圖
類圖解釋 1.正宗的工廠方法模式
2.定義一個介面,然後定義兩個實現,通過超人制造工廠製造超人
1.經典的建造者模式
2.哎!不對勁,通用的模式上抽象的是建造者與產品沒有關係呀!!!是的,但是可以加強,在抽象建造者上使用了模板方法模式,每一個建造者都必須返回一個產品,但是產品如何製造的,由各個建造者自己負責
程式碼 見【工廠模式超人程式碼】 見【建造模式超人程式碼】

程式碼

  • 工廠模式超人程式碼

    • ISuperMan

      package com.peng.pk_gc;
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public interface ISuperMan {
          // 特殊技能
          public void specialTalent();
      }
      
    • AdultSuperMan

      package com.peng.pk_gc;
      
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public class AdultSuperMan implements ISuperMan {
      
          // 成年超人
          @Override
          public void specialTalent() {
              System.out.println("成年超人:超人力大無窮!");
          }
      
      }
      
    • ChildSuperMan

      package com.peng.pk_gc;
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public class ChildSuperMan implements ISuperMan {
          // 兒童超人
          @Override
          public void specialTalent() {
              System.out.println("兒童超人:刀槍不入,快速運動");
          }
      
      }
      
    • SuperManFactory

      package com.peng.pk_gc;
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public class SuperManFactory {
          // 定義一個生產超人的工廠
          public static ISuperMan createSuperMan(String type) {
              // 根據輸入引數產生不同的超人
              if ("adultsuperman".equalsIgnoreCase(type)) {
                  // 生產成人超人
                  return new AdultSuperMan();
              } else if ("childsuperman".equalsIgnoreCase(type)) {
                  // 生產兒童超人
                  return new ChildSuperMan();
              }
              return null;
          }
      }
      
    • Client

      package com.peng.pk_gc;
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public class Client {
          public static void main(String[] args) {
              // 模擬生產超人--生產一個成年超人
              ISuperMan adultSuperMan = SuperManFactory
                      .createSuperMan("adultsuperman");
              adultSuperMan.specialTalent();
              // 模擬生產超人--生產一個兒童超人
              ISuperMan childSuperMan = SuperManFactory
                      .createSuperMan("childsuperman");
              childSuperMan.specialTalent();
      
          }
      
      }
      
    • 執行結果

      成年超人:超人力大無窮!
      兒童超人:刀槍不入,快速運動
      
  • 建造模式超人程式碼

    • SuperMan

      package com.peng.pk_jz;
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public class SuperMan {
          // 超人的軀體
          private String body;
          // 超人的特殊技能
          private String specialTalent;
          // 超人的標誌
          private String specialSymbol;
      
          public String getBody() {
              return body;
          }
      
          public void setBody(String body) {
              this.body = body;
          }
      
          public String getSpecialTalent() {
              return specialTalent;
          }
      
          public void setSpecialTalent(String specialTalent) {
              this.specialTalent = specialTalent;
          }
      
          public String getSpecialSymbol() {
              return specialSymbol;
          }
      
          public void setSpecialSymbol(String specialSymbol) {
              this.specialSymbol = specialSymbol;
          }
      
      }
      
    • Builder

      package com.peng.pk_jz;
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public abstract class Builder {
          // 定義一個超人的應用
          protected final SuperMan superMan = new SuperMan();
      
          // 構建超人的軀體
          public void setBody(String body) {
              this.superMan.setBody(body);
          }
      
          // 構建超人的特殊技能
          public void setSpecialTalent(String specialTalent) {
              this.superMan.setSpecialTalent(specialTalent);
          }
      
          // 構建超人的特殊標記
          public void setSymbol(String specialSymbol) {
              this.superMan.setSpecialSymbol(specialSymbol);
          }
      
          // 構建一個完整的超人
          public abstract SuperMan getSuperMan();
      }
      
    • AdultSuperMan

      package com.peng.pk_jz;
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public class AdultSuperMan extends Builder {
      
          @Override
          public SuperMan getSuperMan() {
              super.superMan.setBody("強壯的軀體");
              super.superMan.setSpecialTalent("會飛行");
              super.superMan.setSpecialSymbol("胸前的S標記");
              return super.superMan;
      
          }
      
      }
      
    • ChildSuperMan

      package com.peng.pk_jz;
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public class ChildSuperMan extends Builder {
      
          @Override
          public SuperMan getSuperMan() {
              super.superMan.setBody("強壯的軀體");
              super.superMan.setSpecialTalent("刀槍不入");
              super.superMan.setSpecialSymbol("胸前的小S標記");
              return super.superMan;
          }
      
      }
      
    • Director

      package com.peng.pk_jz;
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public class Director {
          // 成年超人建造者的應用
          private static Builder adultSuperMan = new AdultSuperMan();
          // 兒童超人建造者的應用
          private static Builder childSuperMan = new ChildSuperMan();
      
          // 建造一個成年超人
          public static SuperMan getAdultSuperMan() {
              return adultSuperMan.getSuperMan();
          }
      
          // 建造一個兒童超人
          public static SuperMan getChildSuperMan() {
              return childSuperMan.getSuperMan();
          }
      }
      
    • Client

      package com.peng.pk_jz;
      
      /**
       * @author kungfu~peng
       * @data 2017年12月8日
       * @description
       */
      public class Client {
          public static void main(String[] args) {
              // 建造一個成人超人
              SuperMan adultSuperMan = Director.getAdultSuperMan();
              System.out.println("成人超人~~");
              System.out.println(adultSuperMan.getBody());
              System.out.println(adultSuperMan.getSpecialSymbol());
              System.out.println(adultSuperMan.getSpecialTalent());
              // 建造一個兒童超人
              SuperMan childSuperMan = Director.getChildSuperMan();
              System.out.println("兒童超人~~");
              System.out.println(childSuperMan.getBody());
              System.out.println(childSuperMan.getSpecialSymbol());
              System.out.println(childSuperMan.getSpecialTalent());
          }
      }
      
    • 執行結果

      成人超人~~
      強壯的軀體
      胸前的S標記
      會飛行
      兒童超人~~
      強壯的軀體
      胸前的小S標記
      刀槍不入
      

最佳實踐

  • 工廠方法模式和建造者模式都屬於物件建立類模式,都用來建立物件,但是他們之間的區別還是比較明顯的
工廠方法模式 建造者模式
意圖不同 關注的是產品的整體,無需關注超人是怎樣建造出來的
【物件建立的粗線條應用】
一個具體的產品的生產依賴各個部件的產生以及裝配順序,他關注的是一步步的組裝起來
【物件建立的細線條應用】
產品的複雜度不同 單一性質的產品
粗粒度
複合產品
細粒度
實際應用中選擇 只需要產品,不關注產品的產生過程 需要詳細關注一個產品的生產、安裝

宣告

  • 摘自秦小波《設計模式之禪》第2版;
  • 僅供學習,嚴禁商業用途;
  • 程式碼手寫,沒有經編譯器編譯,有個別錯誤,自行根據上下文改正;

相關推薦

設計模式建立PK工廠模式VS建造模式

設計模式之禪PK之建立類 建立類設計模式 建立類模式: 工廠方法模式 建造者模式 抽象工廠模式 單例模式 原型模式 建立者模式的功能: 提供物件的建立和管理職責 工廠方法模式、抽象工廠方法模

《大話設計模式》——讀後感 (8)好菜每回味不同——建造模式基礎案例(1)

ted builds src ret 分離 args 類圖 rec 方法 建造者模式:是將一個復雜的對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 建造者模式通常包括下面幾個角色: 1. builder:給出一個抽象接口,以規範產品對象的各個組成成分的

創造模式工廠方法模式VS建造模式

工廠方法模式注重的是整體物件的建立方法,而建造者模式注重的是部件構件的過程,旨在通過一步一步地精確構造創建出一個複雜的物件。我們舉個簡單例子來說明兩者的差異,如要製造一個超人,如果使用工廠方法模式,直接產生出來的就是一個力大無窮、能夠飛翔、內褲外穿的超人;而如果使用建造者模式

建造模式-Builder Pattern 複雜物件的組裝與建立——建造模式(三):關於Director的進一步討論,建造模式總結

8.4 關於Director的進一步討論 指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用於指導具體建造者如何構建產品,它按一定次序呼叫Builder的build

設計模式的藝術 建立模式建造模式

不懂使用為學過,說出用途,繪製結構為了解,不會靈活使用基本等於沒學。 前言 沒有人想買汽車的時候只會單獨買一個輪胎或者一個方向盤,大家買的都是組裝好的一輛完整的汽車,如何將這些部件組裝成一個完整的汽車並返回給客戶,這就是建造者模式需要解決的問題。建造者模式又被稱之為生成器模式,它是一種較為複

Java設計模式(四)建立模式建造模式

一、定義: 建造者模式將一個複雜物件的構建與表示分離,使得同樣的構建過程可以建立不同的表示。 建造者模式的UML結構圖: 建造者模式主要包含四個角色:        Builder:抽象建造者。它宣告為建立一

java設計模式(建立模式)建造模式

1.建造模式的本質 1.實現了物件元件的單獨構造和裝配這個模式的構建過程複雜情況下使用. 2.實現了構建和裝配的解耦,不同構建起,相同的裝配,可以做出不同的物件.相同的構建起,不同裝配順序也可以出現不同的物件,試下了構建演算法/裝配演算法的解耦.實現了

設計模式混編工廠方法模式+策略模式

設計模式之禪混編2工廠方法模式+策略模式迷你版的交易系統“一卡通”專案聯機交易子系統集團公司的架構總部省級分部市級機構業務要求推廣到全國,在山西能做的事在全國的其他地方也能做對於聯機子專案,異地分支機構

設計模式混編命令模式+責任鏈模式

設計模式之禪之混編 命令模式+責任鏈模式 搬移UNIX命令 在Windows系統上使用UNIX命令 UNIX命令 命令名 選項 運算元 UNIX規定 命令名為小寫字母 命令名、選項、操作樹

設計模式》學習小節模板方法模式建造模式和代理模式

一。模板方法模式 其通用類圖如下: 模板方法可以用來定義一個演算法框架;通過將演算法對基本方法的排程封裝在抽象類的公開方法中(模板方法),同時把基本方法交給子類實現;實現了封裝不變部分,擴充套件可變部分的目的。另外,應儘量將基本方法的訪問許可權宣告為保護。 二。建造者

設計模式建造模式(建立型)

模式定義 建造者模式屬於23種設計模式中的建立型模式,可以理解為建立物件的一種很好的方法。 所謂建造者模式就是將元件和元件的元件過程分開,然後一步一步建造一個複雜的物件。所以建造者模式又叫生成器模式。 建造者模式類圖 模式結構 建造者模式包含如下角

設計模式系列建造模式(Builder Pattern)——複雜物件的組裝與建立

說明:設計模式系列文章是讀`劉偉`所著`《設計模式的藝術之道(軟體開發人員內功修煉之道)》`一書的閱讀筆記。個人感覺這本書講的不錯,有興趣推薦讀一讀。詳細內容也可以看看此書作者的部落格`https://blog.csdn.net/LoveLion/article/details/17517213` ## 模

設計模式建造模式(Builder)

人的 做出 字體 存在 分享 定義 固定 也不會 抽象方法 一個人活到70歲以上,都會經歷這樣的幾個階段:嬰兒,少年,青年,中年,老年。並且每個人在各個階段肯定是不一樣的呀,我覺得可以說世界上不存在兩個人在人生的這5個階段的生活完全一樣,但是活到70歲以上的人,都經歷了這幾

設計模式建造模式 Builder

cli return over orb stat implement b- none rect 本質與使用場景 public interface AirShipBuilder { Engine builderEngine(); OrbitalM

GOF23設計模式建造模式(builder)

gin 實例 情況 gof ace state 實現 oid sql 一、建造者模式概述   建造者模式的本質:     1.分離了對象子組件的單獨構造(由Builder負責)和裝配(由Director負責)。從而可以構造出復雜的對象。這個模式適用於:某個對象的過程復雜的情

設計模式建造模式

通過 font 必須 ron 價值 屬性。 color word 內部 當一個類的內部數據過於復雜的時候(通常是負責持有數據的類,比如Config、VO、PO、Entity...),要創建的話可能就需要了解這個類的內部結構,還有這些東西是怎麽組織裝配等一大坨亂七八糟的東西,

設計模式建造模式(創建型)

修改 發現 text href cto stat mar public geek 模式定義 建造者模式屬於23種設計模式中的創建型模式,可以理解為創建對象的一種很好的方法。 所謂建造者模式就是將組件和組件的組件過程分開,然後一步一步建造一個復雜的對象。所以建造者模式又叫生成

(轉自精通Python設計模式)Python設計模式創建型模式——2.建造模式

生成 需要 結構 progress per 展示 有意 odi con   建造者模式將一個復雜對象的構造過程與其表現分離,這樣,同一個構造過程可用於創建多個不同的表現。   我們來看個實際的例子,假設我們想要創建一個HMTL頁面生成器,HTML頁面的基本結構(構造組件)

淺析設計模式(七)——創建型模式Builder(建造模式)

main方法 ref 內部 spa implement line pat 接口 及其 建造者模式Builder 本文的內容: 一、建造者模式的定義 二、建造者模式的參與者及其角色 三、建造者模式的類圖 四、建造者模式的示例 五、參考 一、建造者模式的定義    將一個復

《精通Python設計模式》學習建造模式

ued n) atop num rop put top ike input 這種模式,就是將一個最終對象分級分層建造出來。 在軟件發布過程中,不同的JAVA,PYTHON,NODE.JS,ZIP壓縮包, 就可以使用不同的階段來使用建造者模式的。 from en