設計模式——工廠模式

*除了單例模式和觀察者監聽者模式,本篇再介紹一下工廠模式。。。→_→*

  1. 面向對象編程中出現的問題

    • 在面向對象編程中,可能會會由一種父類派生出許許多多的子類。而當我們在使用new實例化一個子類對象之前,也可能需要進行很多提前操作,比如調用其他的方法、獲取相應的參數列表的值、在數據庫中查詢相關信息等

    • 當類型越來越多、名字越來越複雜的時候,每次去實例化一個子類對象時,都要進行很多提前操作,這就導致了出現了大量的可能產生問題的代碼。使得可維護性下降,發生錯誤的時候查詢錯誤、更正錯誤就會變得非常困難

  2. 工廠模式的作用

    • 工廠模式的應用實現了代碼的高內聚低耦合,其中定義了創建子類對象的接口,封裝了子類對象的創建過程,這樣我們就不用每次都辛苦的寫一堆實例化子類對象的提前操作

    • 工廠模式的應用也使實例化子類對象的操作延遲到了子類中,因爲只有在子類中可以決定到底實例化哪一個類

  3. 工廠模式結構示意圖

    • 工廠模式
  4. 代碼實現

#include <iostream>
#include <vld.h>
using namespace std;

//產品父類
class Product
{
public:
    virtual ~Product() = 0;
protected:
    Product() {};
};
Product::~Product() {}

//產品子類A
class ConcreteProductA : public Product
{ 
public:
    ~ConcreteProductA() {}
    ConcreteProductA() 
    { 
        cout << "ConcreteProductA..." << endl; 
    }
};

//產品子類B
class ConcreteProductB : public Product
{
public:
    ~ConcreteProductB() {}
    ConcreteProductB()
    {
        cout << "ConcreteProductB..." << endl;
    }
};

//產品子類C
class ConcreteProductC : public Product
{
public:
    ~ConcreteProductC() {}
    ConcreteProductC()
    {
        cout << "ConcreteProductC..." << endl;
    }
};

//工廠父類
class Factory
{
public:
    virtual ~Factory() = 0;
    //工廠父類中提供實例化不同產品子類的調用接口,即純虛函數
    //在工廠子類中重寫調用接口,多個調用接口的重載以實現實例化不同的產品子類
    //這樣就將實例化產品子類對象的操作延遲到了工廠子類中
    virtual Product* CreateProduct(int num) = 0;
protected:
    Factory() {}
};
Factory::~Factory() {}

//工廠子類
class ConcreteFactory : public Factory
{
public:
    ~ConcreteFactory() {}
    ConcreteFactory()
    { 
        cout << "ConcreteFactory..." << endl; 
    }
    //工廠子類中提供了實例化產品子類的調用接口
    //很好地將提前操作封裝起來,實現代碼的高內聚低耦合,提高了代碼的可維護性和可擴展性
    //可以通過參數switch不同的產品子類的實例化調用接口
    Product* CreateProduct(int num)
    {
        switch (num)
        {
        case 0:
            return new ConcreteProductA();
            break;
        case 1:
            return new ConcreteProductB();
            break;
        case 2:
            return new ConcreteProductC();
            break;
        default:
            break;
        }
    }
};

int main()
{
    Factory* fac = new ConcreteFactory();//創建工廠子類
    //利用工廠子類提供的調用接口實例化某一種產品對象
    Product* pA = fac->CreateProduct(0);
    Product* pB = fac->CreateProduct(1);
    Product* pC = fac->CreateProduct(2);

    delete pA;
    delete pB;
    delete pC;
    delete fac;
    return 0;
}

運行結果

工廠模式運行結果

*碼完。。。收工。。。→_→*

發佈了107 篇原創文章 · 獲贊 36 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章