Builder(生成器)-對象創建型模式

来源:http://www.cnblogs.com/mgp200866130/archive/2016/04/24/5428577.html
-Advertisement-
Play Games

一.意圖 將一個複雜對象的構建與它的表示分離,使得同樣的構造過程可以創建不同的表示。 二.動機 一個複雜的對象的構造過程中,原料相同,可能會要求生產不同的產品,並且生產的產品種類還能夠方便的增加。Bulider模式期望將解析原材料的過程與利用原材料生產產品的過程分離開,以達到用戶不需要知道根據原材料 ...


一.意圖

    將一個複雜對象的構建與它的表示分離,使得同樣的構造過程可以創建不同的表示。

二.動機

    一個複雜的對象的構造過程中,原料相同,可能會要求生產不同的產品,並且生產的產品種類還能夠方便的增加。Bulider模式期望將解析原材料的過程與利用原材料生產產品的過程分離開,以達到用戶不需要知道根據原材料構建產品的詳細過程,並可以方便的增加新的產品。

三.適用性

  • 當創建複雜對象的演算法應該獨立於該對象的組成部分以及它們的裝配方式時。
  • 當構造過程必須允許被構造的對象有不同的表示時。

四.類圖

    

如以上類圖所示,Director只負責組建整個流程,並不關心組建的具體過程,組建的細節由每一個Bulider負責。

五.實例代碼

    

#include "Builder.h"
#include "Product.h"
#include <iostream>
#include <cstdlib>
#include <cstdio>

class Director
{
public:
    Builder* m_builder;
    Product * m_product;
    Director(Builder*builder) : m_builder(builder)
    {

    }
    void ParseElement(int element)
    {
        switch (element)
        {
            case 1:
                m_builder->BuildHouse();
                break;
            case 2:
                m_builder->BuildHouse();
                break;
            case 3:
                m_builder->BuildHouse();
        }
    }

    Product * GetProduct()
    {
         m_product = m_builder->GetProduct();
         return m_product;
    }
};
Director.h
#include "Builder.h"
#include "Product.h"
#include <iostream>
#include <cstdlib>
#include <cstdio>

class Director
{
public:
    Builder* m_builder;
    Product * m_product;
    Director(Builder*builder) : m_builder(builder)
    {

    }
    void ParseElement(int element)
    {
        switch (element)
        {
            case 1:
                m_builder->BuildHouse();
                break;
            case 2:
                m_builder->BuildHouse();
                break;
            case 3:
                m_builder->BuildHouse();
        }
    }

    Product * GetProduct()
    {
         m_product = m_builder->GetProduct();
         return m_product;
    }
};
Builder.h
#ifndef PRODUCT_H_
#define PRODUCT_H_


class Product
{
public:
    Product()
    {
    }
};

class ProductA : Product
{
    public:
    ProductA()
    {
    }
};

class ProductB : Product
{
public:
    ProductB()
    {
    }
};

class ProductC : Product
{
public:
    ProductC()
    {
    }
};

#endif
Product.h
#include "Director.h"
#include "Builder.h"

void main()
{
    Builder *builder = (Builder *)new BuilderA();
    auto director = new Director(builder);
    director->ParseElement(1);
    director->ParseElement(2);
    director->ParseElement(3);
    auto product = director->GetProduct();

    builder = (Builder *)new BuilderB();
    director = new Director(builder);
    director->ParseElement(1);
    director->ParseElement(2);
    director->ParseElement(3);
    product = director->GetProduct();

    builder = (Builder *)new BuilderC();
    director = new Director(builder);
    director->ParseElement(1);
    director->ParseElement(2);
    director->ParseElement(3);
    product = director->GetProduct();

    while(1);
    

}
Test Code

以上實例代碼,以建房子為例,其中材料用整數1,2,3模擬,代表不同的材料。Director為解析材料的工作人員。有BuliderA,BuliderB,BuliderC三位建築師,解析材料的工作人員把材料交給三位建築師後,將會建造出三種不同的房子。測試結果如下:

六.效果

  • 可以改變一個產品的內部表示
  • 將構造代碼和表示代碼分開
  • 對構造過程進行更精細的控制。

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

-Advertisement-
Play Games
更多相關文章
  • Java併發編程系列【未完】: Java 併發編程:核心理論 Java併發編程:Synchronized及其實現原理 Java併發編程:Synchronized底層優化(輕量級鎖、偏向鎖) 一、重量級鎖 上篇文章中向大家介紹了Synchronized的用法及其實現的原理。現在我們應該知道,Synch ...
  • 微信支付介面文檔:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1 首先你得知道這個jsapi是不能離開微信進行調用支付的,明白了這個道理我們好下手,頁面是在微信內顯示並通過jsapi調用微信支付組件進行支付。 可以看看我們上一 ...
  • 下載頁: http://www.rabbitmq.com/install-standalone-mac.html 1、下載頁面首部的文件(頁面下載可能比較慢,使用迅雷下載就好),之後解壓到一個合適的路徑(例如:/Users/enniu1/Desktop/zjg/)。 2、配置命令訪問路徑 cd ~ ...
  • 上一篇文末,提到非虛擬介面 NVI 的實現,即將虛函數聲明為保護型或私有型,藉由模板函數模式來實現 。 園友 @KillU 看的很仔細,提出了一個問題:虛函數是 private 類型,繼承可以麽? 答案是:完全可以 5 實現權和調用權 <Effective C++> 中給的解釋是: 重寫一個虛函數, ...
  • 圖片上傳 Index.php文件代碼: upload.php代碼: 圖片上傳步驟: 1:接收參數 2:判斷錯誤 3:判斷格式是否合法 4:判斷文件大小 5:判斷是是不是真正的圖片 6:判斷是否是http post提交 文件上傳 Index.php文件代碼: <!DOCTYPE html> <html ...
  • AWT事件處理基本概念 AWT事件處理過程中,主要涉及3類對象: ① Event(事件):用戶對組件的一個操作,稱之為一個事件,以類的形式出現,例如,鍵盤操作對應的事件類是KeyEvent。其實例在該事件發生時由系統自動產生。每一種事件都對應專門的監聽者。 ② Event Source(事件源):事 ...
  • 1. Spring MVC簡介 Spring MVC是java EE平臺請求驅動類型的輕量級Web框架,使用了MVC設計模式的思想,spring框架的主要優勢之一就是分層架構,分層架構允許選擇使用任何一個組件,同時也可以集成其它框架技術,例如:Struts2、Hibernate等 Spring框架具 ...
  • 獲取【下載地址】 QQ: 313596790 【免費支持更新】三大資料庫 mysql oracle sqlsever 更專業、更強悍、適合不同用戶群體【新錄針對本系統的視頻教程,手把手教開發一個模塊,快速掌握本系統】 A集成代碼生成器 [正反雙向(單表、主表、明細表、樹形表,開發利器)+快速構建表單 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...