自建網(wǎng)站模板營銷外包
一、 什么是工廠模式
工廠模式(Factory Pattern)是一種創(chuàng)建型設計模式,它提供了一種創(chuàng)建對象的接口,但是將對象的實例化過程推遲到子類中。工廠模式允許通過調用一個共同的接口方法來創(chuàng)建不同類型的對象,而無需暴露對象的實例化邏輯。
工廠模式的主要目標是解耦對象的創(chuàng)建和使用,以及提供一種更靈活的方式來管理對象的實例化。通過使用工廠模式,可以輕松添加新類型的對象,而不會影響到已有的代碼。
工廠模式通常涉及以下幾個核心角色:
- 產(chǎn)品(Product):這是一個抽象類或接口,定義了所創(chuàng)建對象的通用接口。
- 具體產(chǎn)品(Concrete Product):這些是實現(xiàn)了產(chǎn)品接口的具體類,它們是工廠方法模式的創(chuàng)建目標。
- 工廠(Factory):這是一個抽象類或接口,定義了創(chuàng)建對象的接口方法。工廠類通常是一個創(chuàng)建具體產(chǎn)品對象的工廠方法。
- 具體工廠(Concrete Factory):這些是實現(xiàn)了工廠接口的具體類,它們負責實例化具體的產(chǎn)品對象。
工廠模式可以分為三種常見的變體:
- 簡單工廠模式(Simple Factory Pattern):通過一個共同的工廠類來創(chuàng)建對象,客戶端只需傳遞一個參數(shù)來指定所需的對象類型。雖然不是嚴格意義上的設計模式,但它是工廠模式的基礎。
- 工廠方法模式(Factory Method Pattern):定義一個工廠接口,具體的工廠子類負責實現(xiàn)工廠接口并創(chuàng)建對象。每個具體工廠對應一個特定的產(chǎn)品。
- 抽象工廠模式(Abstract Factory Pattern):提供了一種創(chuàng)建一系列相關或相互依賴對象的接口,而無需指定具體類。適用于創(chuàng)建一組相互關聯(lián)的產(chǎn)品。
二、簡單工廠模式的代碼樣例
簡單工廠模式(Simple Factory Pattern)雖然不是嚴格的設計模式,但它是工廠模式的一種基本形式,適用于創(chuàng)建單一類別的對象。在簡單工廠模式中,有一個工廠類負責根據(jù)客戶端的請求創(chuàng)建不同類型的對象。
以下是一個用C++實現(xiàn)簡單工廠模式的示例:
#include <iostream>// 抽象產(chǎn)品類
class Product {
public:virtual void operation() = 0;
};// 具體產(chǎn)品類A
class ConcreteProductA : public Product {
public:void operation() override {std::cout << "ConcreteProductA operation." << std::endl;}
};// 具體產(chǎn)品類B
class ConcreteProductB : public Product {
public:void operation() override {std::cout << "ConcreteProductB operation." << std::endl;}
};// 簡單工廠類
class SimpleFactory {
public:// 根據(jù)傳入的參數(shù)創(chuàng)建不同類型的產(chǎn)品對象static Product* createProduct(char type) {if (type == 'A') {return new ConcreteProductA();} else if (type == 'B') {return new ConcreteProductB();} else {return nullptr; // 可以拋出異?;蚱渌幚?/span>}}
};int main() {// 客戶端通過工廠創(chuàng)建產(chǎn)品Product* productA = SimpleFactory::createProduct('A');Product* productB = SimpleFactory::createProduct('B');if (productA) {productA->operation();delete productA;}if (productB) {productB->operation();delete productB;}return 0;
}
在這個例子中,我們定義了一個抽象產(chǎn)品類 Product,然后有兩個具體的產(chǎn)品類 ConcreteProductA 和 ConcreteProductB。簡單工廠類 SimpleFactory 有一個靜態(tài)方法 createProduct,根據(jù)傳入的參數(shù)來創(chuàng)建不同類型的產(chǎn)品對象。
雖然簡單工廠模式簡化了對象的實例化,但它的弊端在于如果需要添加新類型的產(chǎn)品,就需要修改工廠類的代碼。因此,當需要支持更多產(chǎn)品類型時,更推薦使用工廠方法模式或抽象工廠模式。
三、工廠方法模式的代碼樣例
工廠方法模式(Factory Method Pattern)是一種創(chuàng)建型設計模式,它定義了一個用于創(chuàng)建對象的接口,但是將具體的對象實例化推遲到子類中。每個具體的工廠子類負責創(chuàng)建特定類型的對象。這種模式使得客戶端代碼與具體創(chuàng)建對象的代碼分離,實現(xiàn)了松耦合。
以下是一個用C++實現(xiàn)工廠方法模式的示例:
#include <iostream>// 抽象產(chǎn)品類
class Product {
public:virtual void operation() = 0;
};// 具體產(chǎn)品類A
class ConcreteProductA : public Product {
public:void operation() override {std::cout << "ConcreteProductA operation." << std::endl;}
};// 具體產(chǎn)品類B
class ConcreteProductB : public Product {
public:void operation() override {std::cout << "ConcreteProductB operation." << std::endl;}
};// 抽象工廠類
class Factory {
public:virtual Product* createProduct() = 0;
};// 具體工廠類A
class ConcreteFactoryA : public Factory {
public:Product* createProduct() override {return new ConcreteProductA();}
};// 具體工廠類B
class ConcreteFactoryB : public Factory {
public:Product* createProduct() override {return new ConcreteProductB();}
};int main() {// 客戶端通過具體工廠來創(chuàng)建產(chǎn)品Factory* factoryA = new ConcreteFactoryA();Product* productA = factoryA->createProduct();productA->operation();delete factoryA;delete productA;Factory* factoryB = new ConcreteFactoryB();Product* productB = factoryB->createProduct();productB->operation();delete factoryB;delete productB;return 0;
}
在這個例子中,我們定義了一個抽象產(chǎn)品類 Product,然后有兩個具體的產(chǎn)品類 ConcreteProductA 和 ConcreteProductB。抽象工廠類 Factory 定義了一個純虛函數(shù) createProduct,由具體的工廠子類來實現(xiàn)該方法并創(chuàng)建特定類型的產(chǎn)品對象。
客戶端使用具體的工廠類來創(chuàng)建產(chǎn)品,這樣客戶端代碼與具體的產(chǎn)品創(chuàng)建代碼分離,實現(xiàn)了解耦。工廠方法模式允許通過添加新的工廠子類來支持新的產(chǎn)品類型,而無需修改現(xiàn)有的代碼。
四、抽象工廠模式的代碼樣例
抽象工廠模式(Abstract Factory Pattern)是一種創(chuàng)建型設計模式,它提供一個接口用于創(chuàng)建一系列相關或相互依賴的對象,而無需指定具體類。抽象工廠模式適用于需要創(chuàng)建一組相互關聯(lián)的產(chǎn)品的情況,它將一組相關的工廠類封裝起來。
以下是一個用C++實現(xiàn)抽象工廠模式的示例:
#include <iostream>// 抽象產(chǎn)品類A
class AbstractProductA {
public:virtual void operationA() = 0;
};// 具體產(chǎn)品類A1
class ConcreteProductA1 : public AbstractProductA {
public:void operationA() override {std::cout << "ConcreteProductA1 operation." << std::endl;}
};// 具體產(chǎn)品類A2
class ConcreteProductA2 : public AbstractProductA {
public:void operationA() override {std::cout << "ConcreteProductA2 operation." << std::endl;}
};// 抽象產(chǎn)品類B
class AbstractProductB {
public:virtual void operationB() = 0;
};// 具體產(chǎn)品類B1
class ConcreteProductB1 : public AbstractProductB {
public:void operationB() override {std::cout << "ConcreteProductB1 operation." << std::endl;}
};// 具體產(chǎn)品類B2
class ConcreteProductB2 : public AbstractProductB {
public:void operationB() override {std::cout << "ConcreteProductB2 operation." << std::endl;}
};// 抽象工廠類
class AbstractFactory {
public:virtual AbstractProductA* createProductA() = 0;virtual AbstractProductB* createProductB() = 0;
};// 具體工廠類1
class ConcreteFactory1 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA1();}AbstractProductB* createProductB() override {return new ConcreteProductB1();}
};// 具體工廠類2
class ConcreteFactory2 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA2();}AbstractProductB* createProductB() override {return new ConcreteProductB2();}
};int main() {// 客戶端通過具體工廠來創(chuàng)建一組相關的產(chǎn)品AbstractFactory* factory1 = new ConcreteFactory1();AbstractProductA* productA1 = factory1->createProductA();AbstractProductB* productB1 = factory1->createProductB();productA1->operationA();productB1->operationB();delete factory1;delete productA1;delete productB1;AbstractFactory* factory2 = new ConcreteFactory2();AbstractProductA* productA2 = factory2->createProductA();AbstractProductB* productB2 = factory2->createProductB();productA2->operationA();productB2->operationB();delete factory2;delete productA2;delete productB2;return 0;
}
在這個例子中,我們定義了兩組相關的產(chǎn)品類:AbstractProductA 和 AbstractProductB,然后分別有兩個具體的產(chǎn)品類。抽象工廠類 AbstractFactory 定義了兩個純虛函數(shù),分別用于創(chuàng)建 AbstractProductA 和 AbstractProductB 對象。具體的工廠類 ConcreteFactory1 和 ConcreteFactory2 實現(xiàn)了這些方法,并創(chuàng)建特定類型的產(chǎn)品對象。
通過使用抽象工廠模式,客戶端可以通過具體的工廠來創(chuàng)建一組相關的產(chǎn)品,實現(xiàn)了一種創(chuàng)建一系列相互關聯(lián)產(chǎn)品的方式。這有助于實現(xiàn)高內聚、低耦合的設計。
五、三種工廠模式之間的關系
這三種工廠模式(簡單工廠模式、工廠方法模式和抽象工廠模式)都是創(chuàng)建型設計模式,旨在解決對象的創(chuàng)建問題。它們之間有一些共同點,但也存在一些差異。下面是它們之間的關系和區(qū)別:
共同點:
- 都關注對象的創(chuàng)建,封裝了對象的實例化過程,使客戶端代碼與具體創(chuàng)建邏輯分離。
- 都遵循了開閉原則,即可以通過添加新的產(chǎn)品類或工廠類來擴展功能,而無需修改現(xiàn)有代碼。
差異:
- 簡單工廠模式:雖然不是嚴格意義上的設計模式,但它是工廠模式的基礎。它通過一個共同的工廠類來創(chuàng)建不同類型的對象,客戶端根據(jù)參數(shù)來指定對象類型。適用于創(chuàng)建單一類別的對象。
- 工廠方法模式:定義了一個工廠接口,由具體的工廠子類來實現(xiàn)工廠接口并創(chuàng)建特定類型的產(chǎn)品對象。每個工廠只負責創(chuàng)建一種產(chǎn)品。適用于創(chuàng)建一組相關的產(chǎn)品,每個產(chǎn)品有一個對應的工廠。
- 抽象工廠模式:提供了一種創(chuàng)建一組相關或相互依賴對象的接口,每個具體的工廠子類負責創(chuàng)建一組相關產(chǎn)品。適用于創(chuàng)建一組相互關聯(lián)的產(chǎn)品,每組產(chǎn)品都有一個對應的工廠。
適用場景:
- 簡單工廠模式適用于創(chuàng)建簡單的對象,例如基于傳入?yún)?shù)創(chuàng)建對象的情況。
- 工廠方法模式適用于需要創(chuàng)建多種具有相同接口的產(chǎn)品,而且每種產(chǎn)品都有對應的工廠。
- 抽象工廠模式適用于創(chuàng)建一組相關或相互依賴的產(chǎn)品,且每組產(chǎn)品都有對應的工廠。
總之,這三種工廠模式都在不同情況下提供了靈活的對象創(chuàng)建機制,可以根據(jù)具體的需求來選擇合適的模式。簡單工廠模式通常是基礎,而工廠方法模式和抽象工廠模式則在更復雜的場景下提供更大的靈活性。