常用設計模式之簡單工廠模式

来源:https://www.cnblogs.com/LifeAndSuger/archive/2022/12/29/17012913.html
-Advertisement-
Play Games

簡單工廠模式 (C++) 工廠模式的使用場景也比較多,像是一些組件對象的創建場景,這裡說一下簡單工廠模式。 特點及應用 1. 特點 (1)封裝具體實現,只提供管理對象介面 舉個例子:我現在需要一個界面工廠,工廠只需要給我對應界面就可以,而我不需要去關心界面裡面是怎樣實現的,如何創建的。 (2)集中管 ...


簡單工廠模式 (C++)

工廠模式的使用場景也比較多,像是一些組件對象的創建場景,這裡說一下簡單工廠模式。

特點及應用

1. 特點

(1)封裝具體實現,只提供管理對象介面

舉個例子:我現在需要一個界面工廠,工廠只需要給我對應界面就可以,而我不需要去關心界面裡面是怎樣實現的,如何創建的。

(2)集中管理和控制

因為創建的產品不多,通常一個工廠類就行,這個工廠既可以負責同一類產品的創建,也可以是不同,實現對外創建對象的職責集中管理和控制。

(3)根據參數返回實例

你想返回得到一個什麼樣的對象實例,往往取決參數的選擇,這個需要結合實際情況去選擇。

2. 解決了什麼問題

(1)通過簡單工廠,實現調用類和具體實現類的解耦。(2) 幫助封裝,面向介面編程。(3)集中管理。

3. 選擇

(1)負責創建的對象比較少,業務邏輯不過於複雜。

寫法介紹

結構組成

  • 一個抽象父類產品,若幹子類產品,一個工廠類(不是抽象類)。

具體實現

  • 產品類
#ifndef PRODUCT_H
#define PRODUCT_H
#include <iostream>

enum ProductTypeItem
{
    PRODUCT_ITEM_NONE,
    PRODUCT_ITEM_APPLE,
    PRODUCT_ITEM_BANANA,
    PRODUCT_ITEM_NR
};

class productParent
{
public:
    explicit productParent(ProductTypeItem type)
        : mType(type)
    {
        std::cout << "I am [" << mType << "]!" << std::endl;
    }
    productParent(const productParent &) = delete;
    productParent &operator=(const productParent &) = delete;
    virtual ~productParent(){}

    virtual ProductTypeItem getProductName(){}
protected:
    ProductTypeItem mType;
};

class productApple : public productParent
{
public:
    explicit productApple(ProductTypeItem type) : productParent(type){}
    productApple(const productApple &) = delete;
    productApple &operator=(const productApple &) = delete;
    ~productApple(){}
};

class productBanana : public productParent
{
public:
    explicit productBanana(ProductTypeItem type) : productParent(type){}
    productBanana(const productBanana &) = delete;
    productBanana &operator=(const productBanana &) = delete;
    ~productBanana(){}
};
#endif // PRODUCT_H
  • 工廠類
#ifndef FACTORYABSTRACT_H
#define FACTORYABSTRACT_H

#include "product.h"

class MyFactory
{
public:
    MyFactory(){}
    ~MyFactory(){}

    // 有的也會把創建方法寫成靜態,那麼這個方法就屬於類,不用創建對象也能使用
    // static productParent *createProduct(ProductTypeItem type)
    productParent *createProduct(ProductTypeItem type)
    {
        switch (type)
        {
        case PRODUCT_ITEM_APPLE:
            return new productApple(type);
        case PRODUCT_ITEM_BANANA:
            return new productBanana(type);
        default:
            break;
        }
        return nullptr;
    }
};
#endif //  FACTORYABSTRACT_H
  • main函數
#include "factory.h"

int main()
{
    MyFactory factory;
    productParent *apple = factory.createProduct(PRODUCT_ITEM_APPLE);
    productParent *banana = factory.createProduct(PRODUCT_ITEM_BANANA);

    delete apple;
    delete banana;
    return 0;
}

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

-Advertisement-
Play Games
更多相關文章
  • 摘要:今日校園攜手華為雲資料庫聯合打造穩定高效的數據底座服務,基於雲原生資料庫GaussDB(for Cassandra) 提供的超強讀寫、彈性擴展、便捷管理等能力,高效支撐業務穩定運行。 隨著信息技術的發展,移動校園APP走入萬千高校,不僅為廣大師生提供了高效便捷的校園服務,也為校園生活增添了更多 ...
  • MongoDB 的副本集類似於有自動故障修複功能的主從集群,提供了數據的冗餘和高可用,是所有生產部署的基礎。 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者:KAiTO 文章來源:GreatSQL社區原創 什麼是慢查詢日誌 MySQL 的慢查詢日誌,用來記錄在 MySQL 中響應時間超過閥值的語句,具體 ...
  • 無序列表 無序列表的標簽:<ul></ul> 無序列表列表項的標簽:<li></li> ul標簽中只能嵌套li標簽,不能存放別的標簽或者數字,li標簽之中可以存放任何元素和標簽 無序列表會預設在每個列表項前面增加一個小點,如下圖所示: 有序列表 有序列表標簽:<ol></ol> 有序列表列表項的標簽 ...
  • 表格的基本語法以及標簽 表格示例1: table標簽就是表格的標簽,用來建立一個表格 tr標簽表示行,一個<tr></tr>標簽就是一行 td標簽表示數據單元格的內容,可以理解為列 th標簽為表頭單元格,和td不同的是,它在表格中會居中且加粗 tr要嵌套在table裡面,td要嵌套在tr里 tabl ...
  • 超鏈接標簽:<a href="https://www.bilibili.com/" target="_self">B站</a> href是a標簽必須要有的屬性,裡面可以放網址,也可以放#,井號代表空鏈接,在任意處點擊空鏈接,都會回到頁面頂部 href還可以存放id,如:#top,如果有標簽的id=" ...
  • 1、使用瀏覽器監聽切屏為例 此處為考慮瀏覽器相容性推薦使用:document.addEventListener 1.1、正常函數使用如下: let n = 0; let max = 3; // 切屏最大次數 document.addEventListener("visibilitychange", ...
  • 作者:王春雨 前言 隨著前端工程化的快速發展, TypeScript 變得越來越受歡迎,它已經成為前端開發人員必備技能。 TypeScript 最初是由微軟開發並開源的一種編程語言,自2012年10月發佈首個公開版本以來,它已得到了人們的廣泛認可。TypeScript 發展至今,已經成為很多大型項目 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...