介紹:
抽象工廠模式是一種創(chuàng)建型模式。它為創(chuàng)建一組相關(guān)或者是相互依賴的對(duì)象提供一個(gè)接口,而不是指定它們的具體類。
類圖:

AbstractProduct(抽象產(chǎn)品類):需要?jiǎng)?chuàng)建的產(chǎn)品的抽象類。
ConcreteProduct(具體產(chǎn)品類):為實(shí)現(xiàn)抽象產(chǎn)品的某個(gè)具體產(chǎn)品類。
AbstractFactory(抽象工廠類):工廠模式方法核心,創(chuàng)建一系列產(chǎn)品對(duì)象。
ConcreteFactory(具體工廠類):實(shí)現(xiàn)抽象工廠中定義的創(chuàng)建產(chǎn)品的方。
用法:
? 一個(gè)對(duì)象組有相同的約束時(shí)可以使用抽象工廠模式
個(gè)人理解:
在生產(chǎn)多個(gè)產(chǎn)品組合的對(duì)象時(shí)使用抽象工廠模式,也就是需要在一個(gè)工廠中生成一系列特定的產(chǎn)品對(duì)象時(shí)使用這模式,本質(zhì)還是創(chuàng)建對(duì)象。
例子:
在這里引用《大話設(shè)計(jì)模式》中此篇幅的例子:數(shù)據(jù)庫MySQL和Oracle雖然都是用數(shù)SQL語句寫,但操作語法上也會(huì)存在區(qū)別。假如一個(gè)公司更換數(shù)據(jù)庫,對(duì)于業(yè)務(wù)層的代碼來說需要把所有地方的語法都換一下,會(huì)改到崩潰。
需求:用抽象工廠模式實(shí)現(xiàn)數(shù)據(jù)庫表操作
1、實(shí)現(xiàn)數(shù)據(jù)庫表操作
1.1、實(shí)現(xiàn)User表操作(第一個(gè)產(chǎn)品類)
public interface IUser {
public void setUser(int id,String name);
public String getUserName(int id);
}
public class MySQLUser implements IUser{
@Override
public void setUser(int id, String name) {
//將id、name插入數(shù)據(jù)庫表
System.out.println("在MySql中增加一條記錄:");
}
@Override
public String getUserName(int id) {
//獲取id位置的name值
System.out.println("在MySql中獲得一條記錄:");
return null;
}
}
public class OracleUser implements IUser{
@Override
public void setUser(int id, String name) {
//將id、name插入數(shù)據(jù)庫表
System.out.println("在Oracle中增加一條記錄:");
}
@Override
public String getUserName(int id) {
//獲取id位置的name值
System.out.println("在Oracle中獲得一條記錄:");
return null;
}
}
這部分內(nèi)容是屬于操作User表的過程,IUser接口直接對(duì)接業(yè)務(wù)層,也就是我們需要調(diào)用的方法。而MySQLUser、和OracleUser屬于具體產(chǎn)品的角色,實(shí)現(xiàn)各自的數(shù)據(jù)庫操作。如果這部分閱讀有困難請(qǐng)先參考簡(jiǎn)單工廠模式和工廠方法模式理解一下產(chǎn)品類。
1.2、實(shí)現(xiàn)Department表操作(第二個(gè)產(chǎn)品類)
public interface IDepartment {
public void setDepartment(int id,String name);
public String getDepartmentName(int id);
}
public class MySQLDepartment implements IDepartment {
@Override
public void setDepartment(int id, String name) {
//將id、name插入Department表
System.out.println("在MySql中增加一條記錄:");
}
@Override
public String getDepartmentName(int id) {
//獲取id位置的name值
System.out.println("在MySql中獲得一條記錄:");
return null;
}
}
public class OracleDepartment implements IDepartment {
@Override
public void setDepartment(int id, String name) {
//將id、name插入Department表
System.out.println("在Oracle中增加一條記錄:");
}
@Override
public String getDepartmentName(int id) {
//獲取id位置的name值
System.out.println("在Oracle中獲得一條記錄:");
return null;
}
}
同理,IDepartment也是對(duì)接業(yè)務(wù)層代碼的。然后數(shù)據(jù)庫中的N個(gè)表的交互都是按這樣的結(jié)構(gòu)去寫了,每個(gè)表對(duì)應(yīng)一個(gè)操作類。
1.3、實(shí)現(xiàn)數(shù)據(jù)庫工廠類
public interface IDBFactory {
public IUser createUser();
public IDepartment createDepartment();
}
public class MySQLFactory implements IDBFactory {
@Override
public IUser createUser() {
return new MySQLUser();
}
@Override
public IDepartment createDepartment() {
return new MySQLDepartment();
}
}
public class OracleFactory implements IDBFactory {
@Override
public IUser createUser() {
return new OracleUser();
}
@Override
public IDepartment createDepartment() {
return new OracleDepartment();
}
}
我們可以看出,在抽象工廠IDBFactory分別創(chuàng)建出兩個(gè)產(chǎn)品了。與工廠方法模式相比較,抽象工廠模式僅僅是用于創(chuàng)建多個(gè)產(chǎn)品,而工廠方法模式是一個(gè)工廠創(chuàng)建一個(gè)產(chǎn)品。
1.4、實(shí)現(xiàn)
public class Test {
public static void main(String[] args) {
IDBFactory factory = new MySQLFactory();
IUser user = factory.createUser();
user.setUser(1,"曉明");
user.getUserName(1);
IDepartment department = factory.createDepartment();
department.setDepartment(1,"技術(shù)部");
department.getDepartmentName(1);
}
}
在這里此模式的用法已經(jīng)介紹完啦,需要換數(shù)據(jù)庫就直接改動(dòng)IDBFactory factory = new OracleFactory();這行代碼就行了。
2、簡(jiǎn)單工廠模式 VS 工廠方法模式 VS 抽象工廠模式
三種工廠方法,第一次學(xué)習(xí)的時(shí)候可能會(huì)混亂,下面來總結(jié)一下:
| 類型 | 簡(jiǎn)單工廠 | 工廠方法 | 抽象工廠 |
|---|---|---|---|
| 定義 | 一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化那個(gè)類 | 一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化那個(gè)類 | 它為創(chuàng)建一組相關(guān)或者是相互依賴的對(duì)象提供一個(gè)接口 |
| 用法 | 生成一個(gè)復(fù)雜對(duì)象 | 生成一個(gè)復(fù)雜對(duì)象 | 生成一組復(fù)雜對(duì)象 |
| 使用 | IProduct p = EasyFactory.create("a"); | IProduct p = new Facotry().getProduct(); | IFactory f = new Factory(); ProductA a = f.getProductA(); PrdocutB b = f.getProductB(); |
2.1、相同點(diǎn)
? 用法一樣,本質(zhì)是創(chuàng)建復(fù)雜對(duì)象
? 產(chǎn)品角色結(jié)構(gòu)一樣,每個(gè)具體產(chǎn)品角色都有相似的行為
2.2、不同點(diǎn)
? 選擇邏輯:簡(jiǎn)單工廠模式感知不了工廠的存在,選擇判斷的邏輯在工廠類內(nèi)部實(shí)現(xiàn)。工廠方法模式和抽象工廠模式的選擇邏輯在客戶端使用類,需要知道工廠的存在
? 創(chuàng)建對(duì)象:簡(jiǎn)單工廠模式和工廠方法模式用于創(chuàng)建一個(gè)復(fù)雜對(duì)象,抽象工廠模式用于創(chuàng)建一系列對(duì)象。
? 擴(kuò)展產(chǎn)品:簡(jiǎn)單工廠模式需要在工廠類內(nèi)部增加新分支,改變了工廠類的內(nèi)部結(jié)構(gòu);工廠方法模式需要增加相應(yīng)的工廠類,系統(tǒng)類的個(gè)數(shù)將成對(duì)增加;抽象工廠模式需要修改抽象工廠和所有的具體工廠
總結(jié)
抽象工廠模式其實(shí)就是創(chuàng)建一系列對(duì)象時(shí)用的,更具有“品牌效應(yīng)”。我們簡(jiǎn)單使用的話把工廠三兄弟區(qū)別起來就可以了。
感謝您的閱讀~
轉(zhuǎn)載請(qǐng)注明出處喔:http://www.itdecent.cn/p/af2c1f96af05
推薦閱讀
基礎(chǔ)篇:
設(shè)計(jì)模式前篇之——UML類圖必會(huì)知識(shí)點(diǎn)
設(shè)計(jì)模式前篇之——一起過一下面向?qū)ο蟮母拍?/a>
創(chuàng)建型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:簡(jiǎn)單工廠模式——來試試接入支付功能
簡(jiǎn)易理解設(shè)計(jì)模式之:工廠方法模式——數(shù)據(jù)存儲(chǔ)例子
簡(jiǎn)易理解設(shè)計(jì)模式之:抽象工廠模式——更換數(shù)據(jù)庫例子
簡(jiǎn)易理解設(shè)計(jì)模式之:建造者模式——學(xué)習(xí)使用“鏈?zhǔn)秸{(diào)用”
簡(jiǎn)易理解設(shè)計(jì)模式之:原型模式——深、淺拷貝的概念
簡(jiǎn)易理解設(shè)計(jì)模式之:?jiǎn)卫J健獑卫J降膸追N常用寫法
結(jié)構(gòu)型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:適配器模式——Android列表視圖控件設(shè)計(jì)方式
簡(jiǎn)易理解設(shè)計(jì)模式之:橋接模式——穿衣服經(jīng)典案例2
簡(jiǎn)易理解設(shè)計(jì)模式之:組合模式——實(shí)現(xiàn)View中的樹狀結(jié)構(gòu)
簡(jiǎn)易理解設(shè)計(jì)模式之:裝飾模式——穿衣服經(jīng)典案例
簡(jiǎn)易理解設(shè)計(jì)模式之:外觀模式——第三方SDK的幫助類
簡(jiǎn)易理解設(shè)計(jì)模式之:享元模式——五子棋游戲例子
簡(jiǎn)易理解設(shè)計(jì)模式之:代理模式——iOS視圖控件設(shè)計(jì)方式
行為型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:策略模式——優(yōu)化一下支付功能
簡(jiǎn)易理解設(shè)計(jì)模式之:模板方法模式——Android中的BaseActivity基類
簡(jiǎn)易理解設(shè)計(jì)模式之:觀察者模式——監(jiān)聽與回調(diào)
簡(jiǎn)易理解設(shè)計(jì)模式之:狀態(tài)模式——優(yōu)化登錄操作
簡(jiǎn)易理解設(shè)計(jì)模式之:備忘錄模式——Word文檔的工作原理
簡(jiǎn)易理解設(shè)計(jì)模式之:迭代器模式——遍歷對(duì)象的好幫手
簡(jiǎn)易理解設(shè)計(jì)模式之:命令模式——實(shí)現(xiàn)命令的參數(shù)化配置
簡(jiǎn)易理解設(shè)計(jì)模式之:責(zé)任鏈模式——OA中請(qǐng)假流程示例
簡(jiǎn)易理解設(shè)計(jì)模式之:中介者模式——多人聊天室例子
簡(jiǎn)易理解設(shè)計(jì)模式之:解釋器模式——語言和文法
簡(jiǎn)易理解設(shè)計(jì)模式之:訪問者模式——員工考核例子