乙個專案最初使用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。此類設計使用抽象工廠模式最合適不過。抽象...