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

設計模式實作系列(一):Factory Method 工廠方法模式 - 讓子類別決定實例化哪個類別

     編輯:關於C++

模式意圖

定義一個用於創建物件的介面,讓子類別決定實例化哪一個類別。Factory Method 使一個類別的實例化延遲到其子類別。

UML 結構圖

Factory Method UML

核心解析

  • Product: 產品抽象介面。
  • ConcreteProduct: 具體產品實現。
  • Creator: 抽象建立者,宣告工廠方法 FactoryMethod(),並提供 AnOperation() 使用產品。
  • ConcreteCreator: 實作 FactoryMethod() 回傳具體產品。
  • 關鍵: Creator 不知具體產品類別,僅透過介面操作;子類別決定實例化細節。

C++ 完整實作

1. Factory.h

#ifndef FACTORY_H
#define FACTORY_H

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

class ConcreteProduct : public Product {
public:
    ConcreteProduct();
    virtual ~ConcreteProduct();
};

class Creator {
public:
    Creator() {}
    virtual ~Creator() {}
    void AnOperation();
protected:
    virtual Product* FactoryMethod() = 0;
};

class ConcreteCreator : public Creator {
public:
    ConcreteCreator();
    virtual ~ConcreteCreator();
protected:
    virtual Product* FactoryMethod();
};

#endif

2. Factory.cpp

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

using namespace std;

ConcreteProduct::ConcreteProduct() { cout << "construction of ConcreteProduct\n"; }
ConcreteProduct::~ConcreteProduct() { cout << "destruction of ConcreteProduct\n"; }

void Creator::AnOperation() {
    Product* p = FactoryMethod();
    cout << "an operation of product\n";
}

ConcreteCreator::ConcreteCreator() { cout << "construction of ConcreteCreator\n"; }
ConcreteCreator::~ConcreteCreator() { cout << "destruction of ConcreteCreator\n"; }
Product* ConcreteCreator::FactoryMethod() { return new ConcreteProduct(); }

3. Main.cpp

#include "Factory.h"
#include <cstdlib>

int main(int argc, char* argv[]) {
    Creator* p = new ConcreteCreator();
    p->AnOperation();
    delete p;
    return 0;
}

簡單工廠 vs 工廠方法 vs 抽象工廠

模式結構適用場景擴充性
簡單工廠單一類別含 switch-case 創建產品固定、較少變化違反 OCP,新增產品需修改工廠
工廠方法Creator 衍生體系,每類產品一工廠單一產品等級、需延遲實例化符合 OCP,新增產品只需新增 Creator 子類
抽象工廠多工廠方法創建相關產品族多產品等級構成家族、需整套切換新增家族易、新增等級難

現代 C++:參數化工廠

std::unique_ptr<Product> CreateProduct(ProductType type) {
    switch (type) {
        case ProductType::A: return std::make_unique<ConcreteProductA>();
        case ProductType::B: return std::make_unique<ConcreteProductB>();
    }
    return nullptr;
}

簡單場景下,參數化工廠函數比完整類別體系更輕量。

適用場景

  • 框架預留擴充點:文檔編輯器 CreateView()、編譯器 CreateParser()。
  • 測試替身注入:TestCreator 回傳 Mock 產品。
  • 動態載入外掛:依設定檔實例化對應 Creator。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved