設計模式(C 實現)(十三) 抽象工廠模式

2021-09-24 04:06:04 字數 2667 閱讀 5661

乙個專案最初使用sqlserver資料庫,後來根據專案情況要使用mysql資料庫,此時需要更改所有和資料庫有關的介面,工作量大,如果後期又要切換成postgresql資料庫,則所有和資料庫有關的介面又要都改一遍。有沒有方法能夠在切換資料庫的時候,不修改這麼多介面?

可使用這個思路來解決:確定乙個廠商的工廠,就可以確定所有物品都是**於該廠商。比如要獲取耐克的鞋、褲子、上衣、襪子等,則建立耐克這個廠商的工廠,然後從該工廠中取出來的鞋子,一定就是耐克的鞋子了。

abstractfactory.h

該檔案實現了使用者資料基類(iuser)、部門資料基類(idepartment)、工廠類基類(ifactory)。以及sqlserver使用者資料類csqlserveruser(繼承iuser)、mysql使用者資料類cmysqluser(繼承iuser);sqlserver部門資料類csqlserverdepartment(繼承idepartment)、mysql部門資料類cmysqldepartment(繼承idepartment);sqlserver工廠類csqlserve***ctory(繼承ifactory)、mysql工廠類cmysqlfactory(繼承ifactory)。

呼叫工廠類csqlserve***ctory或者cmysqlfactory的createuser、createdepartment方法,則可建立針對不同資料庫型別造作的物件。這樣可以做到,當切換不同的資料庫時,只需修改工廠類(繼承ifactory的類)的建立即可。

#pragma once

#include //使用者資料基類

class iuser

virtual ~iuser()

virtual void insertuser() = 0;

virtual void getuser() = 0;

};//sqlserver使用者資料類

class csqlserveruser : public iuser

virtual ~csqlserveruser()

void insertuser()

void getuser() };

//mysql使用者資料類

class cmysqluser : public iuser

virtual ~cmysqluser()

void insertuser()

void getuser() };

//部分資料基類

class idepartment

virtual ~idepartment()

virtual void insertdepartment() = 0;

virtual void getdepartment() = 0;

};//sqlserver部門資料類

class csqlserverdepartment : public idepartment

virtual ~csqlserverdepartment()

void insertdepartment()

void getdepartment() };

//mysql部門資料類

class cmysqldepartment : public idepartment

virtual ~cmysqldepartment()

void insertdepartment()

void getdepartment() };

//工廠基類

class ifactory

virtual ~ifactory()

virtual iuser* createuser() = 0;

virtual idepartment* createdepartment() = 0;

void deluser() }

void deldepartment() }

iuser* m_puser;

idepartment* m_pdepartment;

};//sqlserver工廠類

class csqlserve***ctory : public ifactory

virtual ~csqlserve***ctory()

iuser* createuser()

idepartment* createdepartment() };

//mysql工廠類

class cmysqlfactory : public ifactory

virtual ~cmysqlfactory()

iuser* createuser()

idepartment* createdepartment()

};

main.cpp

//#include "abstractfactory.h"

int main()

執行結果

抽象工廠模式,提供乙個建立一系列相關或者相互依賴物件的介面,而無需指定他們具體的類。

抽象工程模式的好處:

1. 易於切換產品系列。建立不同的工廠,即可切換所有產品;

2. 具體的建立例項過程與客戶端分離,客戶端是通過他們的抽象介面操縱例項,產品的具體類名也被具體工廠的實現分離,不會出現在客戶**中。

返回目錄:設計模式(c++實現)(總)

C 實現設計模式 抽象工廠模式

感覺抽象工廠模式有點像你去買電腦的時候,先告訴賣電腦的你要買聯想的,然後再告訴賣電腦的你要個滑鼠,最後你喜提聯想的滑鼠回家了。這裡也感謝菜鳥教程,提供免費的學習資料。優點 當乙個產品族中的多個物件被設計成一起工作時,它能保證客戶端始終只使用同乙個產品族中的物件。缺點 產品族擴充套件非常困難,要增加乙...

設計模式 抽象工廠模式實現

抽象工廠方法 抽象工廠模式是圍繞乙個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。一 基本模式的實現 以乙個使...

設計模式之抽象工廠模式 C 實現

前面兩篇文章分別介紹了,簡單工廠模式以及工廠方法模式。接下來我將介紹一下,抽象工廠模式。抽象工廠模式主要用於具有複雜層級和分類的設計中。比如,分別把網絡卡驅動和音效卡驅動當作一種product。那windows和linux以及mac都需要這兩種product。此類設計使用抽象工廠模式最合適不過。抽象...