工廠類模式(三)抽象工廠

在介紹抽象工廠之前经瓷,我們先了解以下概念

產(chǎn)品等級

對于Cpu,有高通生產(chǎn)的Cpu绘雁,華為生產(chǎn)的麒麟Cpu橡疼,以及聯(lián)發(fā)科的MTK Cpu,它們都屬于Cpu這同一產(chǎn)品等級庐舟。對于空調(diào)欣除,由美的空調(diào)、海爾空調(diào)挪略,他們也屬于同一個產(chǎn)品等級

產(chǎn)品族

由一個工廠生產(chǎn)的不同等級的產(chǎn)品構(gòu)成了一個產(chǎn)品族历帚,美的公司生產(chǎn)空調(diào)、電冰箱瘟檩、洗衣機抹缕,這些產(chǎn)品構(gòu)成了一個產(chǎn)品族。
抽象工廠和工廠模式最大的區(qū)別是

工廠模式解決的同一產(chǎn)品等級的問題
抽象共產(chǎn)解決的是產(chǎn)品族的問題

抽象工廠的定義

抽象工廠提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口
我們在使用時不需要知道或關(guān)心它從這些工廠方法中獲得對象的具體類型墨辛,因為我們客戶端程序僅使用這些對象的通用接口

抽象工廠具體實現(xiàn)

  1. 首先定義兩個產(chǎn)品等級卓研,空調(diào)(AirConditioningSystem)和洗衣機(Refrigerator)。其中美的工廠生產(chǎn)美的洗衣機和美的空調(diào)睹簇,海爾工廠生產(chǎn)海爾洗衣機和海爾空調(diào)奏赘。
public interface AirConditioningSystem
{
    void produce();
}
public class HaierAirConditioningSystem implements AirConditioningSystem
{
    @Override
    public void produce()
    {
        System.out.println("海爾空調(diào)");
    }
}
public class MideaAirConditioningSystem implements AirConditioningSystem
{
    @Override
    public void produce()
    {
        System.out.println("美的空調(diào)");
    }
}
public interface Refrigerator
{
    void produce();
}
public class MideaRefrigerator implements Refrigerator
{
    @Override
    public void produce()
    {
        System.out.println("美的冰箱");
    }
}

public class HaierRefrigerator implements Refrigerator
{
    @Override
    public void produce()
    {
        System.out.println("海爾冰箱");
    }
}
  1. 定義工廠類
public interface JiadianFactory
{
    Refrigerator produceRefrigetor();
    AirConditioningSystem produceAirConditioningSystem();
}
public class HaierJiadianFactory implements JiadianFactory
{
    @Override
    public Refrigerator produceRefrigetor()
    {
        return new HaierRefrigerator();
    }

    @Override
    public AirConditioningSystem produceAirConditioningSystem()
    {
        return new HaierAirConditioningSystem();
    }
}
public class MideaJiadianFactory implements JiadianFactory
{
    @Override
    public Refrigerator produceRefrigetor()
    {
        return new MideaRefrigerator();
    }

    @Override
    public AirConditioningSystem produceAirConditioningSystem()
    {
        return new MideaAirConditioningSystem();
    }
}
  1. 定義客戶類
public class Client
{

    public static void main(String[] args)
    {
        JiadianFactory jiadianFactory = new HaierJiadianFactory();
        JiadianFactory jiadianFactory2 = new MideaJiadianFactory();
        Refrigerator refrigerator = jiadianFactory.produceRefrigetor();
        AirConditioningSystem airConditioningSystem = jiadianFactory.produceAirConditioningSystem();
        refrigerator.produce();
        airConditioningSystem.produce();
    }
}

這樣我們應(yīng)用層的代碼是和具體的空調(diào)以及電冰箱是解耦的。我們在客戶類里并沒由導(dǎo)入海爾空調(diào)以及海爾電冰箱的類太惠。
其UML類圖如下


優(yōu)點

  • 應(yīng)用層代碼不和具體的產(chǎn)品進行依賴磨淌,它只和具體的工廠發(fā)生依賴關(guān)系
  • 擴展性好,當(dāng)我們新增具體的產(chǎn)品時凿渊,只需要增加其對應(yīng)的工廠梁只,并不需要修改其他類的代碼

缺點

  • 新增產(chǎn)品等級比較麻煩,需要修改對應(yīng)的工廠接口以及每一個實現(xiàn)類
  • 增加了系統(tǒng)的抽象性和理解難度

使用場景

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

應(yīng)用

jdbc中的Connection
jdbc中的Connection為一個接口搪锣,里面有許多方法,這里我們挑選幾個

Statement createStatement() throws SQLException;
DatabaseMetaData getMetaData() throws SQLException;

其中這兩個方法返回的Statement和DataBasemetaData均為接口彩掐,其在具體的工廠類中進行實例化构舟。我們可以把Connection理解為抽象工廠類,Statement和DataBasemetaData為產(chǎn)品類堵幽。而每一種數(shù)據(jù)庫驅(qū)動都會有該Connection的自己具體實現(xiàn)類狗超,比如在Mysql中具體實現(xiàn)類為CommectionImpl弹澎,對于這兩個方法,其分別返回了自己的實現(xiàn)類StatementImpl和com.mysql.jdbc.DataBasemetaData努咐。在這里com.mysql.jdbc.DataBasemetaData是java.sql.DataBasemetaData的一個具體實現(xiàn)類
MyBatis中的SqlSessionFactory
mybatis中的SqlSeeionFactory定義如下


我們可以發(fā)現(xiàn)其內(nèi)部定義的方法返回結(jié)果有SqlSession接口和Configuration類對象苦蒿。
SqlSeesionFactory相當(dāng)于一個抽象工廠。而其實現(xiàn)有DefaultSqlSessionFactorySqlSessionManager渗稍,在這兩個類中我們都可以獲取其對應(yīng)的具體SqlSession和Configuration實現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刽肠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子免胃,更是在濱河造成了極大的恐慌音五,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羔沙,死亡現(xiàn)場離奇詭異躺涝,居然都是意外死亡,警方通過查閱死者的電腦和手機扼雏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門坚嗜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诗充,你說我怎么就攤上這事苍蔬。” “怎么了蝴蜓?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵碟绑,是天一觀的道長。 經(jīng)常有香客問我茎匠,道長格仲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任诵冒,我火速辦了婚禮凯肋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汽馋。我一直安慰自己侮东,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布豹芯。 她就那樣靜靜地躺著悄雅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪告组。 梳的紋絲不亂的頭發(fā)上煤伟,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天癌佩,我揣著相機與錄音木缝,去河邊找鬼便锨。 笑死,一個胖子當(dāng)著我的面吹牛我碟,可吹牛的內(nèi)容都是我干的放案。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼矫俺,長吁一口氣:“原來是場噩夢啊……” “哼吱殉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厘托,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤友雳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铅匹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體押赊,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年包斑,在試婚紗的時候發(fā)現(xiàn)自己被綠了流礁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡罗丰,死狀恐怖神帅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萌抵,我是刑警寧澤找御,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站绍填,受9級特大地震影響萎坷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沐兰,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一哆档、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧住闯,春花似錦瓜浸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至量窘,卻和暖如春雇寇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工锨侯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嫩海,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓囚痴,卻偏偏與公主長得像叁怪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子深滚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345