首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

設計模式深度解析:工廠方法模式的結構、實現與模板優化

     編輯:關於C

工廠方法模式屬於創建型模式,其核心意圖是定義一個創建對象的接口,讓子類決定實例化哪個具體類,從而將對象創建的具體邏輯延遲到子類,實現「開閉原則」——對擴展開放,對修改關閉。

適用場景

  • 類無法預知它必須創建的對象類別。
  • 類希望由子類指定創建的對象。
  • 將創建職責委託給多個輔助子類之一,並將哪個輔助類是委託者這一信息局部化。

模式結構與參與者

工廠方法模式結構圖

  1. Product(抽象產品):定義工廠方法創建的對象接口。
  2. ConcreteProduct(具體產品):實現 Product 接口的具體類。
  3. Creator(創建者/抽象工廠):聲明返回 Product 的工廠方法 CreateProduct(),可提供默認實現;另含 GetProduct() 等業務方法調用工廠方法。
  4. ConcreteCreator(具體創建者):重寫 CreateProduct() 返回特定 ConcreteProduct 實例。

潛在問題與模板優化方案

純虛函數方案要求每個新產品都編寫一個新的 ConcreteCreator 子類,導致類爆炸。C++ 可利用模板技術消除樣板代碼:

class Creator {
public:
    virtual Product* CreateProduct() = 0;
    Product* GetProduct() {
        if (!m_product) m_product = CreateProduct();
        return m_product;
    }
private:
    Product* m_product = nullptr;
};

template <typename TheProduct>
class StandardCreator : public Creator {
public:
    Product* CreateProduct() override { return new TheProduct(); }
};

客戶代碼極其簡潔:

StandardCreator<OurProduct> creator;
Product* p = creator.GetProduct(); // 自動創建 OurProduct 實例

完整代碼示例

factory.h

#ifndef FACTORY_H
#define FACTORY_H

class Product { };

class Creator {
public:
    Creator() : m_pProduct(nullptr) {}
    Product* GetProduct();
    virtual Product* CreateProduct() = 0;
private:
    Product* m_pProduct;
};

template <class TheProduct>
class StandardCreator : public Creator {
public:
    virtual Product* CreateProduct();
};

template <typename TheProduct>
Product* StandardCreator<TheProduct>::CreateProduct() {
    return new TheProduct();
}

#endif

factory.cpp

#include "factory.h"
#include <iostream>

Product* Creator::GetProduct() {
    if (nullptr == m_pProduct) {
        m_pProduct = CreateProduct();
    }
    return m_pProduct;
}

test.cpp

#include "factory.h"
#include <iostream>

class MyProduct : public Product {
public:
    MyProduct() { std::cout << "MyProduct constructed!\n"; }
};
class YourProduct : public Product {
public:
    YourProduct() { std::cout << "YourProduct constructed!\n"; }
};
class OurProduct : public Product {
public:
    OurProduct() { std::cout << "OurProduct constructed!\n"; }
};

int main() {
    StandardCreator<OurProduct> ourCreator;
    Product* p = ourCreator.GetProduct();

    StandardCreator<MyProduct> myCreator;
    p = myCreator.GetProduct();

    StandardCreator<YourProduct> yourCreator;
    p = yourCreator.GetProduct();

    std::cin.get();
    return 0;
}

運行效果

程序運行輸出

輸出依次顯示三種產品的構造信息,驗證了模板工廠正確實例化了不同具體產品。

總結

工廠方法模式通過多態性實現創建邏輯的解耦;模板版 StandardCreator 進一步消除了為每個產品編寫具體工廠類的樣板代碼,是 C++ 中實現該模式的優雅慣用法。實際項目中常結合智能指針(std::unique_ptr)管理產品生命周期,避免內存洩漏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved