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

設計模式實作系列(二):Abstract Factory 抽象工廠模式 - 創建相關物件家族

     編輯:關於C++

模式意圖

提供一個創建一系列相關或相互依賴物件的介面,而無需指定它們具體的類別。

UML 結構圖

Abstract Factory UML

核心解析:Factory Method 的擴充

  • AbstractProductA/B: 產品族介面(如椅子/沙發)。
  • ConcreteProductA1/A2...: 具體產品實現(現代風/古典風椅子)。
  • AbstractFactory: 宣告創建各產品的工廠方法 CreateProductA(), CreateProductB()。
  • ConcreteFactory1/2: 實作創建特定風格全套產品(現代風工廠/古典風工廠)。
  • 關鍵: 客戶端針對 AbstractFactory 程式設計,切換工廠即切換整套產品風格。

C++ 完整實作

1. AbstractFactory.h

#ifndef ABSTRACTFACTORY_H
#define ABSTRACTFACTORY_H

class AbstractProductA {
public:
    AbstractProductA() {}
    virtual ~AbstractProductA() {}
};
class ConcreteProductA1 : public AbstractProductA {
public:
    ConcreteProductA1(); virtual ~ConcreteProductA1();
};
class ConcreteProductA2 : public AbstractProductA {
public:
    ConcreteProductA2(); virtual ~ConcreteProductA2();
};

class AbstractProductB {
public:
    AbstractProductB() {}
    virtual ~AbstractProductB() {}
};
class ConcreteProductB1 : public AbstractProductB {
public:
    ConcreteProductB1(); virtual ~ConcreteProductB1();
};
class ConcreteProductB2 : public AbstractProductB {
public:
    ConcreteProductB2(); virtual ~ConcreteProductB2();
};

class AbstractFactory {
public:
    AbstractFactory() {}
    virtual ~AbstractFactory() {}
    virtual AbstractProductA* CreateProductA() = 0;
    virtual AbstractProductB* CreateProductB() = 0;
};

class ConcreteFactory1 : public AbstractFactory {
public:
    ConcreteFactory1(); virtual ~ConcreteFactory1();
    virtual AbstractProductA* CreateProductA();
    virtual AbstractProductB* CreateProductB();
};

class ConcreteFactory2 : public AbstractFactory {
public:
    ConcreteFactory2(); virtual ~ConcreteFactory2();
    virtual AbstractProductA* CreateProductA();
    virtual AbstractProductB* CreateProductB();
};

#endif

2. AbstractFactory.cpp

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

ConcreteProductA1::ConcreteProductA1() { std::cout << "construction of ConcreteProductA1\n"; }
ConcreteProductA1::~ConcreteProductA1() { std::cout << "destruction of ConcreteProductA1\n"; }
ConcreteProductA2::ConcreteProductA2() { std::cout << "construction of ConcreteProductA2\n"; }
ConcreteProductA2::~ConcreteProductA2() { std::cout << "destruction of ConcreteProductA2\n"; }
ConcreteProductB1::ConcreteProductB1() { std::cout << "construction of ConcreteProductB1\n"; }
ConcreteProductB1::~ConcreteProductB1() { std::cout << "destruction of ConcreteProductB1\n"; }
ConcreteProductB2::ConcreteProductB2() { std::cout << "construction of ConcreteProductB2\n"; }
ConcreteProductB2::~ConcreteProductB2() { std::cout << "destruction of ConcreteProductB2\n"; }

ConcreteFactory1::ConcreteFactory1() { std::cout << "construction of ConcreteFactory1\n"; }
ConcreteFactory1::~ConcreteFactory1() { std::cout << "destruction of ConcreteFactory1\n"; }
AbstractProductA* ConcreteFactory1::CreateProductA() { return new ConcreteProductA1(); }
AbstractProductB* ConcreteFactory1::CreateProductB() { return new ConcreteProductB1(); }

ConcreteFactory2::ConcreteFactory2() { std::cout << "construction of ConcreteFactory2\n"; }
ConcreteFactory2::~ConcreteFactory2() { std::cout << "destruction of ConcreteFactory2\n"; }
AbstractProductA* ConcreteFactory2::CreateProductA() { return new ConcreteProductA2(); }
AbstractProductB* ConcreteFactory2::CreateProductB() { return new ConcreteProductB2(); }

3. Main.cpp

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

int main() {
    ConcreteFactory1* pFactory1 = new ConcreteFactory1();
    AbstractProductA* pProductA = pFactory1->CreateProductA();

    ConcreteFactory2* pFactory2 = new ConcreteFactory2();
    AbstractProductB* pProductB = pFactory2->CreateProductB();

    delete pFactory1; delete pProductA;
    delete pFactory2; delete pProductB;
    return 0;
}

擴充:新增產品族 vs 新增產品等級

  • 新增產品族(新風格): 新增 ConcreteFactory3,符合開放封閉原則。
  • 新增產品等級(新類別如茶几): 需修改 AbstractFactory 及所有 ConcreteFactory,違反開放封閉原則。此為模式已知限制。

適用場景

  • 跨平台 UI 元件庫(Windows/Mac/Linux 按鈕、視窗、選單)。
  • 資料庫驅動族群(Connection/Command/Transaction/Reader)。
  • 遊戲陣營單位生產(人族/獸族/神族建築、單位)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved