設(shè)計(jì)模式:抽象工廠

定義與類型

定義:抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口
無(wú)須指定它們具體的類
類型:創(chuàng)建型

適用場(chǎng)景

  • 客戶端(應(yīng)用層)不依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、實(shí)現(xiàn)等細(xì)節(jié)
  • 強(qiáng)調(diào)一系列相關(guān)的產(chǎn)品對(duì)象(屬于同一產(chǎn)品族)一起使用,創(chuàng)建對(duì)象需要大量重復(fù)代碼
  • 提供一個(gè)產(chǎn)品類的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于具體實(shí)現(xiàn)

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

  • 具體產(chǎn)品在應(yīng)用層代碼隔離,無(wú)須關(guān)心創(chuàng)建細(xì)節(jié)
  • 將一個(gè)系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建

缺點(diǎn)

  • 規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,產(chǎn)品族中擴(kuò)展新的產(chǎn)品困難,需要修改抽象工廠的接口
  • 增加了系統(tǒng)的抽象性和理解難度

產(chǎn)品等級(jí)結(jié)構(gòu)與產(chǎn)品族

以空調(diào)為例:
美的空調(diào),格力空調(diào),奧克斯空調(diào)等是同一產(chǎn)品等級(jí)結(jié)構(gòu)。
美的空調(diào),美的電飯煲,美的微波爐等是同一產(chǎn)品族。
抽象工廠適用于產(chǎn)品族,工廠方法適用于產(chǎn)品等級(jí)結(jié)構(gòu)。

代碼示例

仍然以視頻課程為例,現(xiàn)在有了新的要求,視頻加上筆記才能構(gòu)成一個(gè)完整的課程。

  1. 創(chuàng)建CourseFactory 接口
/**
 * @author lijiayin
 */
public interface CourseFactory {
    
    Video getVideo();
    
    Article getArticle();
}
  1. 創(chuàng)建Video 抽象類
/**
 * @author lijiayin
 */
public abstract class Video {
    
    public abstract void produce();
}
  1. 創(chuàng)建Article 抽象類
/**
 * @author lijiayin
 */
public abstract class Article {
    
    public abstract void produce();
}
  1. 創(chuàng)建JavaVideo 類
/**
 * @author lijiayin
 */
public class JavaVideo extends Video {
    @Override
    public void produce() {
        System.out.println("Java視頻");
    }
}
  1. 創(chuàng)建JavaArticle 類
/**
 * @author lijiayin
 */
public class JavaArticle extends Article {
    @Override
    public void produce() {
        System.out.println("Java筆記");
    }
}
  1. 同理創(chuàng)建Python相關(guān)的類
/**
 * @author lijiayin
 */
public class PythonVideo extends Video {
    @Override
    public void produce() {
        System.out.println("Python視頻");
    }
}
/**
 * @author lijiayin
 */
public class PythonArticle extends Article {
    @Override
    public void produce() {
        System.out.println("Python筆記");
    }
}
/**
 * @author lijiayin
 */
public class PythonCourseFactory implements CourseFactory {
    @Override
    public Video getVideo() {
        return new PythonVideo();
    }![![測(cè)試結(jié)果.png](https://upload-images.jianshu.io/upload_images/18537440-dbaf30ad6378ba4c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
](https://upload-images.jianshu.io/upload_images/18537440-24059b12568b35e2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![測(cè)試結(jié)果.png](https://upload-images.jianshu.io/upload_images/18537440-c1b2c9e96d64d5c9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


    @Override
    public Article getArticle() {
        return new PythonArticle();
    }
}
  1. 創(chuàng)建測(cè)試類
/**
 * @author lijiayin
 */
public class Test {

    public static void main(String[] args) {
        CourseFactory java = new JavaCourseFactory();
        java.getArticle().produce();
        java.getVideo().produce();
        CourseFactory python = new PythonCourseFactory();
        python.getVideo().produce();
        python.getArticle().produce();
    }
}
  1. 測(cè)試結(jié)果


    測(cè)試結(jié)果.png
  2. UML圖


    UML.png

JDK源碼示例

java.sql.Connection接口,當(dāng)使用Oracle數(shù)據(jù)庫(kù)時(shí),Statement createStatement() throws SQLException和PreparedStatement prepareStatement(String sql)throws SQLException這兩個(gè)方法,返回的都是Oracle相關(guān)的具體實(shí)現(xiàn);當(dāng)使用Mysql時(shí),返回的都是Mysql的相關(guān)的具體實(shí)現(xiàn)。

?著作權(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)容

  • 設(shè)計(jì)原則: 要依賴抽象,不要依賴具體類 目錄 本文的結(jié)構(gòu)如下: 什么是抽象工廠模式 為什么要用該模式 模式的結(jié)構(gòu) ...
    w1992wishes閱讀 1,236評(píng)論 0 6
  • 抽象工廠模式 介紹 工廠方法模式通過(guò)引入工廠等級(jí)結(jié)構(gòu),解決了簡(jiǎn)單工廠模式中工廠類職責(zé)太重的問(wèn)題,但由于工廠方法模式...
    666真666閱讀 1,317評(píng)論 0 7
  • 在講解抽象工廠前我們首先需要了解兩個(gè)概念: 產(chǎn)品等級(jí)結(jié)構(gòu):產(chǎn)品的等級(jí)結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu)。如果一個(gè)抽象類是電視機(jī),...
    41uLove閱讀 607評(píng)論 0 1
  • 抽象工廠模式 抽象工廠模式(Abstract Factory Pattern):提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)...
    小旋鋒的簡(jiǎn)書閱讀 1,611評(píng)論 0 1
  • 公司的開發(fā)的項(xiàng)目需求比較多一個(gè)純聊天的簡(jiǎn)單版本,還沒(méi)上線一個(gè)專門用來(lái)內(nèi)部人員測(cè)試的版本一個(gè)發(fā)布的集團(tuán)員工使用的版本...
    蝸牛也有夢(mèng)想閱讀 1,770評(píng)論 0 0

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