溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)庫中抽象工廠模式結(jié)構(gòu)是怎樣的

發(fā)布時(shí)間:2021-11-17 11:29:07 來源:億速云 閱讀:169 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“數(shù)據(jù)庫中抽象工廠模式結(jié)構(gòu)是怎樣的”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“數(shù)據(jù)庫中抽象工廠模式結(jié)構(gòu)是怎樣的”吧!

簡介

抽象工廠模式(Abstract Factory Pattern)隸屬于設(shè)計(jì)模式中的創(chuàng)建型模式,用于產(chǎn)品族的構(gòu)建。

定義

抽象工廠模式:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定他們具體的類。(可以認(rèn)為抽象工廠是對(duì)具有同一主題的一組單獨(dú)工廠方法的封裝)

抽象工廠模式中有一個(gè)產(chǎn)品族的概念,理解了產(chǎn)品族就算是抽象工廠入門了。所謂產(chǎn)品族,就是一系列相關(guān)的產(chǎn)品對(duì)象組成的一族對(duì)象,它們是獨(dú)立的同時(shí)也是互相關(guān)聯(lián)的,它們共同組合在一起可以變成一個(gè)更大的產(chǎn)品。舉例來說,Mac 電腦里所有的 UI 組件是一個(gè)產(chǎn)品族,存在 MacButton MacText 等組件,對(duì)應(yīng)的 Windows 電腦里所有的 UI 組件也組成了一個(gè)產(chǎn)品族,存在 WindowsButton, WindowsText 等組件,兩個(gè)產(chǎn)品族里的產(chǎn)品是不同混合使用的。

角色

抽象工廠模式中存在四種角色,跟工廠方法類似,分別是抽象工廠接口,具體工廠實(shí)現(xiàn),抽象產(chǎn)品接口,具體產(chǎn)品實(shí)現(xiàn)。

不同之處在于抽象產(chǎn)品接口會(huì)存在多個(gè),而且它們之間具有內(nèi)在的相關(guān)關(guān)系。

模式結(jié)構(gòu)

在工廠方法模式中,我們舉了造車的例子,其實(shí)造車這個(gè)例子擴(kuò)展一下也非常適合于講解抽象工廠模式;上面在說明產(chǎn)品族時(shí)舉了Mac 和 Windows 電腦的例子。這里我們使用組裝電腦來演示。

現(xiàn)在組裝電腦不多見了,一般都是筆記本或一體機(jī),以前大家去賣場里單獨(dú)買 CPU,主板,顯示器等組件可以組裝出一臺(tái)電腦來,在我們的系統(tǒng)里,我們有各種組件,用戶可以選擇不同的組件來組裝自己喜歡的電腦。

但有一點(diǎn)需要注意,主板和 CPU 是需要兼容才能使用的,不是隨便搭在一起就成為一臺(tái)電腦了。

// 產(chǎn)品接口
public interface MainBoard {
    public void setCpu();
    public void run();
}
public interface Cpu {
    public void doLogic();
}

// 具體產(chǎn)品實(shí)現(xiàn)
public class IntelMainBoard implements MainBoard {
    private Cpu cpu;
    
    public void run() {
        System.out.println("IntelMainBoard is running.");
    }
    
    public void setCpu(Cpu cpu) {
        this.cpu = cpu;
    }
}

public class AmdMainBoard implements MainBoard {
    private Cpu cpu;
    
    public void run() {
        System.out.println("AmdMainBoard is running.");
    }
    
    public void setCpu(Cpu cpu) {
        this.cpu = cpu;
    }
}

public class IntelCpu implements Cpu {
    public void doLogic() {
        System.out.println("IntelCpu is doing logic");
    }
}

public class AmdCpu implements Cpu {
    public void doLogic() {
        System.out.println("AmdCpu is doing logic");
    }
}

如果由用戶自行組裝,很可能由于Amd 的主板使用了 Intel 的CPU,導(dǎo)致組裝起來的電腦不能正常運(yùn)行,而且這些細(xì)節(jié)也不需要用戶操心。

此時(shí)我們的抽象工廠模式就登場了,抽象工廠就像是賣場工作人員提供給你的幾種套餐一樣,定義了組裝電腦的套餐,用戶可以直接使用套餐里的組件然后組裝成電腦,這樣就絕對(duì)不會(huì)出現(xiàn)兼容問題了。

// 抽象工廠接口
public interface ComponentAbstractFactory {
    public MainBoard getMainBoard();
    public Cpu getCpu();
}

// 具體工廠實(shí)現(xiàn)

// Intel 系列
public class IntelAbstractFactory implements ComponentAbstractFactory {
    public MainBoard getMainBoard() {
        return new IntelMainBoard();
    }
    
    public Cpu getCpu() {
        return new IntelCpu();
    }
}

// Amd 系列電腦
public class AmdAbstractFactory implements ComponentAbstractFactory {
    public MainBoard getMainBoard() {
        return new AmdMainBoard();
    }
    
    public Cpu getCpu() {
        return new AmdCpu();
    }
}

有了套餐用戶不需要擔(dān)心不兼容,可以愉快的組裝電腦然后使用了。

// 電腦接口
public interface Computer {
    // 裝好主板,cpu 裝在主板上
    public void setMainBoard(MainBoard mainBoard);
    //其他的需要放置的東西
    public void otherSettings();
    
    public void run();
}
// 組裝電腦
public class ComboComputer implements Computer {
    // 裝好主板,cpu 裝在主板上
    public void setMainBoard(MainBoard mainBoard){
        //..
    }
    //其他的需要設(shè)置的東西
    public void otherSettings() {
        //....
    }
    
    public void run() {
        mainBoard.run();
    }
}
public class Client {
    public static void main(String[] args) {
        Computer computer = new ComboComputer();
        ComponentAbstractFactory factory = new AmdAbstractFactory();
        
        MainBoard mainBoard = factory.getMainBoard();
        Cpu cpu = factory.getCpu();
        mainBoard.setCpu(cpu);
        
        computer.setMainBoard(mainBoard);
        
        computer.run();
    }
}

大家有沒有發(fā)現(xiàn),用戶為了組裝一臺(tái)電腦出來,雖然不需要了解cpu 廠家之類的細(xì)節(jié)的,還是要了解cpu 怎么裝到主板上,主板又怎么裝到電腦上,然后才能得到一臺(tái)完整的電腦,這里又可以用到前一節(jié)說的工廠方法模式來幫助用戶將電腦組裝起來了。

抽象工廠最初是來自操作系統(tǒng)之間的UI 構(gòu)建,每個(gè)系統(tǒng)有自己的一套 UI界面,現(xiàn)在這個(gè)限制已經(jīng)不是很強(qiáng)了,就像Intel 的主板也可以裝載AMD 的CPU,這通過再實(shí)現(xiàn)一個(gè)抽象工廠類就可以了,還有其他的例子譬如電腦的主題,里面包含字體、背景、策略等一系列產(chǎn)品構(gòu)成的產(chǎn)品族也適合于使用抽象工廠模式。

使用場景

  1. 適合于產(chǎn)品之間相互關(guān)聯(lián)、相互依賴且相互約束的地方

  2. 需要?jiǎng)討B(tài)切換產(chǎn)品族的地方

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  1. 抽象工廠模式將產(chǎn)品族的依賴與約束關(guān)系放到抽象工廠中,便于管理。

  2. 職責(zé)解耦,用戶不需要關(guān)心一堆自己不關(guān)心的細(xì)節(jié),由抽象工廠來負(fù)責(zé)組件的創(chuàng)建

  3. 切換產(chǎn)品族容易,只需要增加一個(gè)具體工廠實(shí)現(xiàn),客戶端選擇另一個(gè)套餐就可以了

缺點(diǎn):

  1. 抽象工廠模式類增加的速度很快,有一個(gè)產(chǎn)品族就需要增加一個(gè)具體工廠實(shí)現(xiàn),比較繁瑣

  2. 產(chǎn)品族難以擴(kuò)展產(chǎn)品。當(dāng)產(chǎn)品族中增加一個(gè)產(chǎn)品時(shí),抽象工廠接口中需要增加一個(gè)函數(shù),對(duì)應(yīng)的所有具體工廠實(shí)現(xiàn)都需要修改,修改放大嚴(yán)重。

  3. 抽象工廠并未完全屏蔽創(chuàng)建細(xì)節(jié),給出的都是組件。對(duì)于這種情況可以結(jié)合工廠模式或簡單工廠模式一起使用。

最佳實(shí)踐

  1. 大家應(yīng)該已經(jīng)發(fā)現(xiàn)了,其實(shí)抽象工廠模式如果只有一個(gè)組件的話,其實(shí)是退化到了工廠方法模式,也就是沒有了產(chǎn)品族的概念,只剩一個(gè)產(chǎn)品了,因此簡單工廠,工廠方法,抽象工廠這三者之間是有內(nèi)在聯(lián)系的,區(qū)別只是產(chǎn)品的復(fù)雜度。

  2. 抽象工廠的本質(zhì)是選擇產(chǎn)品族,因此大家可以根據(jù)這個(gè)特征來識(shí)別是否可以應(yīng)用抽象工廠。

感謝各位的閱讀,以上就是“數(shù)據(jù)庫中抽象工廠模式結(jié)構(gòu)是怎樣的”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)數(shù)據(jù)庫中抽象工廠模式結(jié)構(gòu)是怎樣的這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI