設(shè)計模式03--抽象工廠模式(iOS)

0、序

  • 在上一篇文章《工廠方法模式》中,我們定義了奧迪工廠AudiFactory 生產(chǎn)出來的就是奧迪汽車和 奔馳工廠BenzFactory生產(chǎn)出來的就是奔馳汽車,但是隨著其發(fā)展,奧迪工廠不僅僅生產(chǎn)一種車了,而是生產(chǎn)種種系列車型,比如有SUV系列產(chǎn)品與MPV系列產(chǎn)品,那么此時我們的AudiFactory 就不能滿足需求了,那么該怎么辦呢?
  • 抽象工廠模式正好能解決上面的問題,讓我們一起來看看抽象工廠。
  • 在之前我們先記住上面的一個詞系列產(chǎn)品;

1、抽象工廠模式簡述

  • 對一組具有相同主題的工廠進(jìn)行封裝
    • 以上面的汽車為例,在抽象工廠模式中,會有SUV工廠和MPV工廠,還有一個大的抽象工廠,里面涵蓋了SUV工廠和MPV工廠所有能做的事情。

    • 上面所說的SUV工廠、MPV工廠其實都是可以生產(chǎn)一系列產(chǎn)品的(SUV汽車或者M(jìn)PV汽車),也就是產(chǎn)品族的概念。而在工廠方法模式中,其工廠生產(chǎn)出來的產(chǎn)品是屬于同一個產(chǎn)品等級(比如:不同廠商生產(chǎn)的汽車-奧迪汽車和奔馳汽車)。

    • 相圖

2、抽象工廠模式角色劃分

  • 抽象工廠

    • 抽象類,內(nèi)部提供了所有工廠的接口
  • 具體工廠

    • 具體工廠:可生產(chǎn)所有的系列產(chǎn)品(產(chǎn)品族);
  • 產(chǎn)品系列A

    • 抽象產(chǎn)品A:內(nèi)部提供了A系列產(chǎn)品的共有功能;
    • 具體產(chǎn)品A:A系列具體的單個產(chǎn)品;
    • 注:當(dāng)然,還有A系列的其他的產(chǎn)品,它們屬于同一個產(chǎn)品等級;
  • 產(chǎn)品系列B

    • 抽象產(chǎn)品B:內(nèi)部提供了B系列產(chǎn)品的共有功能;
    • 具體產(chǎn)品B:B系列具體的單個產(chǎn)品;
    • :當(dāng)然,還有B系列的其他的產(chǎn)品,它們屬于同一個產(chǎn)品等級;

3、抽象工廠模式UML類圖

  • 抽象工廠模式

4、抽象工廠模式示意代碼

  • 抽象工廠: YCarAbsFactory

    • 內(nèi)部提供了所有工廠的接口
    @protocol YCarAbsFactory <NSObject>
    + (id<YSuvCar>)creatSuvCar; // 創(chuàng)建SUV系列的車
    + (id<YMpvCar>)creatMpvCar; // 創(chuàng)建MPV系列的車
    @end
    
  • 具體工廠

    • 具體工廠1:YAudiCarFactory:可生產(chǎn)所有的系列產(chǎn)品(產(chǎn)品族);
    @implementation YAudiCarFactory
    + (id<YSuvCar>)creatSuvCar { 
        return [[YAudiSuvCar alloc] init]; // 創(chuàng)建具體的奧迪SUV
    }
    + (id<YMpvCar>)creatMpvCar {
        return [[YAudiMpvCar alloc] init]; // 創(chuàng)建具體的奧迪MPV
    }
    @end
    
    • 具體工廠2:YBenzCarFactory:可生產(chǎn)所有的系列產(chǎn)品(產(chǎn)品族);
    @implementation YBenzCarFactory
    + (id<YSuvCar>)creatSuvCar {
        return [[YBenzSuvCar alloc] init];  // 創(chuàng)建具體的奔馳SUV
    }
    + (id<YMpvCar>)creatMpvCar {
        return [[YBenzMpvCar alloc] init]; // 創(chuàng)建具體的奔馳MPV
    }
    @end
    
    • 補(bǔ)充:可能還會有一個具體工廠3,比如:寶馬工廠,寶馬工廠同樣能生產(chǎn)SUV的車和MPV的車,并且根據(jù)需要在內(nèi)部實現(xiàn)創(chuàng)建具體的產(chǎn)品邏輯;
  • 產(chǎn)品系列A

    • 抽象產(chǎn)品:YSuvCar:內(nèi)部提供了A系列產(chǎn)品的共有功能;
    @protocol YSuvCar <NSObject>
    - (void)suvRun;
    @end
    
    • 具體產(chǎn)品a1:YAudiSuvCar
    @implementation YAudiSuvCar
    - (void)suvRun {
        NSLog(@"奧迪SUV跑起來了");
    }
    @end
    
    • 具體產(chǎn)品a2:YBenzSuvCar
    @implementation YBenzSuvCar
    - (void)suvRun {
        NSLog(@"奔馳SUV跑起來了");
    }
    @end
    
    • :上面的a1、a2屬于同一個產(chǎn)品族(SUV車系)的不同產(chǎn)品等級(奧迪、奔馳);
  • 產(chǎn)品系列B

    • 抽象產(chǎn)品B:YMpvCar:內(nèi)部提供了B系列產(chǎn)品的共有功能;
    @protocol YMpvCar <NSObject>
    - (void)mpvRun;
    @end
    
    • 具體產(chǎn)品b1:YAudiMpvCar
    @implementation YAudiMpvCar
    - (void)mpvRun {
        NSLog(@"奧迪MPV跑起來了");
    }
    @end
    
    • 具體產(chǎn)品b2:YBenzMpvCar
    @implementation YBenzMpvCar
    - (void)mpvRun {
        NSLog(@"奔馳MPV跑起來了");
    }
    @end
    
    • :上面的b1、b2屬于同一個產(chǎn)品族(MPV車系)的不同產(chǎn)品等級(奧迪、奔馳);
  • Client使用

    // 奧迪SUV
    id<YSuvCar> audiSuv = [YAudiCarFactory creatSuvCar];
    [audiSuv suvRun];
    // 奧迪MPV
    id<YMpvCar> audiMpv = [YAudiCarFactory creatMpvCar];
    [audiMpv mpvRun];
      
    // 奔馳SUV
    id<YSuvCar> benzSuv = [YBenzCarFactory creatSuvCar];
    [benzSuv suvRun];
    // 奔馳MPV
    id<YMpvCar> benzMpv = [YBenzCarFactory creatMpvCar];
    [benzMpv mpvRun];
    
    // 運(yùn)行結(jié)果:
    奧迪SUV跑起來了
    奧迪MPV跑起來了
    奔馳SUV跑起來了
    奔馳MPV跑起來了
    

5、抽象工廠模式與工廠方法模式對比

工廠方法模式 抽象工廠模式
工廠類一般只有一個方法,創(chuàng)建一種產(chǎn)品 工廠類有多個方法,創(chuàng)建多系列產(chǎn)品
只涉及產(chǎn)品等級 涉及產(chǎn)品等級與產(chǎn)品族
增加子類即可添加新產(chǎn)品 必須修改父類接口才能添加新產(chǎn)品
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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