簡(jiǎn)易理解設(shè)計(jì)模式之:抽象工廠模式——更換數(shù)據(jù)庫例子

介紹:

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

類圖:

抽象工廠模式UML類圖.png

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ì)模式之:訪問者模式——員工考核例子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容