什么是抽象工廠模式?
提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
抽象工廠模式有哪些優點?
1、最大的好處便是易於交換產品系列,由於具體工廠類,在一個應用中只需要在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同產品配置。
2、它讓具體的創建實例過程與客戶端分離,客戶端是通過它們的抽象接口操作實例,產品的具體類名也被具體工廠的實現分離,不會出現在客戶代碼中。
如果項目使用的是MySQL數據,現在如果需要更換為Oracle數據,為了靈活更換數據庫,如何設計程序呢?
接下來通過抽象工廠模式模仿數據訪問程序。
抽象工廠模式實現:
構建兩張數據庫表的對應類,只聲明,不做任何操作。
Name類:
Type類:
為兩張表創建相應的實現類:
IUser接口,用於客戶端訪問,解除與具體數據庫訪問的耦合:
IType接口,用於客戶端訪問,解除與具體數據庫訪問的耦合:
MySQLUser類,用於訪問MySQL的User表:
OracleUser類,用於訪問Oracle的User表:
同理創建相應的MySQL和Oracle數據庫的Type表。
MySQLType類,用於訪問MySQL的Type表:
OracleType類,用於訪問Oracle的Type表:
接下來再讓我們構建一個IFactory接口,定義一個訪問User表對象和Type對象的抽象的工廠接口。
MySQLFactory類,實現IFactory接口,實例化MySQLUser和MySQLType。
OracleFactory類,實現IFactory接口,實例化OracleUser和OralceType。
客戶端代碼:
只需確認實例化哪一個數據庫訪問對象給factory。
運行結果如下:
只需要更改IFactory factory = new MySQLFactory() 為IFactory factory = new OracleFactory() ,就實現了數據庫訪問的切換了。
有一個User類和User操作類的時候,是只需要工廠方法模式,但是現在顯然你數據中有很多的表,而MySQL和Oracle有時兩大不同的分類,所以解決這種涉及到多個產品系列的問題,就需要抽象工廠模式了。
抽象工廠模式的優點與缺點:
優點:
1、易於交換產品系列,由於具體工廠類,在一個應用中只需要在初始化的時候出現一次,這就使得改變一個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置。
2、它讓具體的創建實例過程與客戶端分離,客戶端是通過它們的抽象接口操縱實例,產品的具體類名也被具體工廠的實現分離,不會出現在客戶代碼中。
缺點:
如果要增加一個項目表Project,那么就需要增加三個類,IProject,MySQLProject,OracleProject,還需要改動IFactory,MySQLFactory,OracleFactory才可以完全實現。這樣是很糟糕的。
編程是門藝術,這樣大批量的改動,顯然是非常丑陋的做法。
解決方案:可以使用簡單工廠來改進抽象工廠。去除IFactory、MySQLFactory、OracleFactory三個工廠類,用一個DataAcces類代替,用一個簡單工廠模式來實現。具體實現代碼省略,有興趣的小伙伴可以自己實現。
喜歡的小伙伴們可以搜索我們個人的微信公眾號“程序員的成長之路”點擊關注或掃描下方二維碼