建造者(生成器)模式C++、Java實現

来源:http://www.cnblogs.com/minbaba/archive/2017/02/05/6368529.html
-Advertisement-
Play Games

1、建造者模式UML 圖1. 建造者模式UML 2、C++實現 C++實現類視圖: 圖2. 建造者模式C++實現的類視圖 其中,Product的實現代碼是(ProductA和ProductB的代碼不再列出): Builder實現代碼是: ConcreteBuilderA的實現代碼是: Concret ...


1、建造者模式UML

圖1. 建造者模式UML

2、C++實現

  C++實現類視圖:

圖2. 建造者模式C++實現的類視圖

  其中,Product的實現代碼是(ProductA和ProductB的代碼不再列出):

 1 //產品抽象基類。
 2 //三個屬性的先後賦值順序代表著不同產品的建立。
 3 class Product
 4 {
 5 private:
 6     std::string attribute1;
 7     std::string attribute2;
 8     std::string attribute3;
 9 
10 public:
11     Product();
12     ~Product();
13 };

  Builder實現代碼是:

 1 //建造者抽象基類。
 2 class Builder
 3 {
 4 public:
 5     Builder();
 6     ~Builder();
 7 
 8     //聲明的3個為Product的三個屬性賦值的函數。
 9     virtual void OperateStep1() = 0;
10     virtual void OperateStep2() = 0;
11     virtual void OperateStep3() = 0;
12 
13     //返回建立好的Product對象。
14     virtual Product * GetResult() = 0;
15 
16 };

  ConcreteBuilderA的實現代碼是:

 1 class ConcreteBuilderA :
 2     public Builder
 3 {
 4 private:
 5     ProductA * pa;
 6 
 7 public:
 8     ConcreteBuilderA() { pa = new ProductA();}
 9     ~ConcreteBuilderA();
10 
11     //函數中是賦值語句,可按具體的產品對象的賦值順序賦值。
12     void OperateStep1() { pa->setAttribute1(""); }
13     void OperateStep2() { pa->setAttribute2(""); }
14     void OperateStep3() { pa->setAttribute3(""); }
15 
16     //返回建立好的ProductA對象。
17     Product * GetResult() { return pa; }
18 };

  ConcreteBuilderB的實現代碼是:

 1 //具體建造者類,建立ProductB的對象,併為ProductB的屬性賦值。
 2 class ConcreteBuilderB :
 3     public Builder
 4 {
 5 private:
 6     ProductB * pb;
 7 
 8 public:
 9     ConcreteBuilderB() { pb = new ProductB(); }
10     ~ConcreteBuilderB();
11 
12     //函數中是賦值語句,可按具體的產品對象的賦值順序賦值。
13     void OperateStep1() { pb->setAttribute3(""); }
14     void OperateStep2() { pb->setAttribute2(""); }
15     void OperateStep3() { pb->setAttribute1(""); }
16 
17     //返回建立好的ProductA對象。
18     Product * GetResult() { return pb; }
19 
20 };

  Director的實現代碼是:

 1 //建造者模式中的監督類。
 2 //向外提供介面,向內定義建造順序。
 3 class Director
 4 {
 5 private:
 6     Builder * builder;
 7 
 8 public:
 9     //按得到的不同的對象,進行不同順序的建造。
10     Director(Builder &b);
11     ~Director();
12 
13     //具體的監督方法。
14     Product * GetResult();
15 };
16 
17 
18 Director::Director(Builder &b)
19 {
20     builder = &b;
21 }
22 
23 //方法中的調用順序固定,建造順序可在不同的Builder對象設置。
24 Product * Director::GetResult()
25 {
26     builder->OperateStep1();
27     builder->OperateStep2();
28     builder->OperateStep3();
29 
30     return builder->GetResult();
31 }//end method GetResult

 

3、Java實現

  Java實現的類視圖

圖3. 建造者模式的Java實現的類視圖

   其中,Product的實現代碼是(ProductA和ProductB的代碼不再列出):

1 public class Product {
2 
3     private String attribute1;
4     private String attribute2;
5     private String attribute3;
6     
7 }//end class Product

  Builder的實現代碼是:

 1 public abstract class Builder {
 2 
 3     //三個為產品屬性賦值的方法。
 4     //三個方法按相應產品必要的順序賦值。
 5     public abstract void OperateStep1();
 6     public abstract void OperateStep2();
 7     public abstract void OperateStep3();
 8     
 9     //一個返回具體產品對象的方法。
10     public abstract Product GetResult();
11     
12 }//end class Builder

  ConcreteBuilderA的實現代碼是:

 1 //具體建造者,負責生產ProductA的對象。
 2 public class ConcreteBuilderA extends Builder {
 3 
 4     private ProductA pa;
 5     
 6     public ConcreteBuilderA() {
 7         // TODO Auto-generated constructor stub
 8         this.pa = new ProductA();
 9     }//end method ConcreteBuilderA
10     
11     //為產品A中的屬性attribute1賦值。
12     @Override
13     public void OperateStep1() {
14         // TODO Auto-generated method stub
15         this.pa.setAttribute1("這是ProductA的屬性attribute1的值:A1");
16         
17         System.out.println(this.pa.getAttribute1());
18     }//end method OperateStep1
19 
20     //為產品A中的屬性attribute2賦值。
21     @Override
22     public void OperateStep2() {
23         // TODO Auto-generated method stub
24         this.pa.setAttribute2("這是ProductA的屬性attribute2的值:A2");
25         
26         System.out.println(this.pa.getAttribute2());
27     }//end method OperateStep2
28 
29     //為產品A中的屬性attribute3賦值。
30     @Override
31     public void OperateStep3() {
32         // TODO Auto-generated method stub
33         this.pa.setAttribute3("這是ProductA的屬性attribute3的值:A3");
34         
35         System.out.println(this.pa.getAttribute3());
36     }//end method OperateStep3
37 
38     //返回建立好的ProductA的對象。
39     @Override
40     public Product GetResult() {
41         // TODO Auto-generated method stub
42         return this.pa;
43     }//end method GetResult
44 
45 }//end class ConcreteBuilderA

  ConcreteBuilderB的實現代碼是:

 1 //具體建造者,負責生產ProductB的對象。
 2 public class ConcreteBuilderB extends Builder {
 3 
 4     private ProductB pb;
 5     
 6     public ConcreteBuilderB() {
 7         // TODO Auto-generated constructor stub
 8         this.pb = new ProductB();
 9     }//end method ConcreteBuilderB
10     
11     //為產品B中的屬性attribute3賦值。
12     @Override
13     public void OperateStep1() {
14         // TODO Auto-generated method stub
15         this.pb.setAttribute3("這是ProductB的屬性attribute3的值:B1");
16         
17         System.out.println(this.pb.getAttribute3());
18     }//end method OperateStep1
19 
20     //為產品B中的屬性attribute2賦值。
21     @Override
22     public void OperateStep2() {
23         // TODO Auto-generated method stub
24         this.pb.setAttribute2("這是ProductB的屬性attribute2的值:B2");
25         
26         System.out.println(this.pb.getAttribute2());
27     }//end method OperateStep2
28 
29     //為產品B中的屬性attribute1賦值。
30     @Override
31     public void OperateStep3() {
32         // TODO Auto-generated method stub
33         this.pb.setAttribute1("這是ProductB的屬性attribute1的值:B3");
34         
35         System.out.println(this.pb.getAttribute1());
36     }//end method OperateStep3
37 
38     //返回建立好的ProductB的對象。
39     @Override
40     public Product GetResult() {
41         // TODO Auto-generated method stub
42         return this.pb;
43     }//end method GetResult
44 
45 }//end class ConcreteBuilderB

  Director的實現代碼是:

 1 //監督者,負責對外介面,按一定順序調用Builder中的三個為Product產品屬性賦值方法。
 2 public class Director {
 3     
 4     private Builder builder;
 5     
 6     public Director(Builder builder) {
 7         // TODO Auto-generated constructor stub
 8         this.builder = builder;
 9     }//end method Director
10     
11     //調用三個賦值方法,並返回建造結果。
12     public Product GetResult() {
13         this.builder.OperateStep1();
14         this.builder.OperateStep2();
15         this.builder.OperateStep3();
16         
17         return this.builder.GetResult();
18     }//end method GetResult
19     
20 }//end method Director

 

4、點擊此處下載源碼


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在進行.netCore平臺後,由於它的版本在.net4.6,C#6之後,所以它的語法也有一些新的特性,主要表現在以下幾個方面 只讀屬性初始化 屬性初始化 字典初始化器 string.Format,後臺引入了$,而且支持智能提示 空對象判斷 空集合判斷 方法-單行實現 感謝各位的閱讀與支持! .Net ...
  • 新年新氣象,也希望新年可以掙大錢。不管今年年底會不會跟去年一樣,滿懷抱負卻又壯志未酬。(不過沒事,我已為各位卜上一卦,卦象顯示各位都能掙錢...)。已經上班兩天了,公司大部分人還在休假,而我早已上班,估計今年我就是加班狗的命。(不說了,要堅強...) 以上扯淡已畢,下麵言歸正傳。 這次的.NET加密 ...
  • TagHelpers 能夠讓服務端代碼參與創建和渲染 HTML 元素,讓整個View視圖看起來只有Html代碼,也讓前臺開發人員開發的頁面直接被後臺開發人員使用,而不需要重覆的書寫代碼,這種設計將會成為主流,語法類似於KO和AngularJs,直接在Html元素上添加對應的標簽即可,下麵介紹幾種主要 ...
  • 首先給大家拜個晚年,祝大家新春快樂,萬事如意,雞年大吉。 好了,前面我們講了很多的工廠模式,其中,有個很明顯的特點,工廠中,有一個方法,裡面有很多的swich case 分支,我們前面說過,我們可以用反射的技術來避免swich case 分支。ok,那麼,今天,我們來用反射+抽象工廠模式 來完善一下 ...
  • 本文章分為三個部分: web網站發佈、IIS6 安裝方法、ASP.NET v4.0 安裝方法 一、web網站發佈 1.打開 Visual Studio 2013 編譯環境 2.在其解決方案上右擊彈出重新生成解決方案,以查看是否有錯誤 3.如果項目沒有錯誤右擊WebUI層發佈 4.這樣將會看到以下界面 ...
  • Smobiler是一個在VS環境中使用.Net語言來開發APP的開發平臺,也許比Xamarin更方便 ...
  • 百萬行代碼架構遷移——有感 背景 身處互聯網暫不知名公司,16年6月份接受公司項目,主要職責是線上項目問題維護、項目開發SE工作附帶項目組事務管理,目前領隊十來人。由於項目整體研發已有4年,中間團隊人員換了幾波,技術總監和項目架構核心設計人員先後離職,項目前景不容樂觀。 舊項目結構描述 java系項 ...
  • 一、概述 代理模式為另一個對象提供一個替身或占位符以控制對這個對象的訪問。其實就是代理就是做到類似轉發的功能,針對不同代理,轉發的具體實現不同。 二、解決問題 從原理知道他就是控制客戶對一個對象的訪問,它跟現實中的中介代理類似,只是作為代表做一些受理工作,真正執行的並不是它自己。比如買火車票,外面有 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...