解析iOS應(yīng)用開(kāi)發(fā)中對(duì)設(shè)計(jì)模式中的抽象工廠(chǎng)模式的實(shí)現(xiàn)
概述
抽象工廠(chǎng)模式是對(duì)象的創(chuàng)建模式,它是工廠(chǎng)方法模式的進(jìn)一步推廣。
假設(shè)一個(gè)子系統(tǒng)需要一些產(chǎn)品對(duì)象,而這些產(chǎn)品又屬于一個(gè)以上的產(chǎn)品等級(jí)結(jié)構(gòu)。那么為了將消費(fèi)這些產(chǎn)品對(duì)象的責(zé)任和創(chuàng)建這些產(chǎn)品對(duì)象的責(zé)任分割開(kāi)來(lái),可以引進(jìn)抽象工廠(chǎng)模式。這樣的話(huà),消費(fèi)產(chǎn)品的一方不需要直接參與產(chǎn)品的創(chuàng)建工作,而只需要向一個(gè)公用的工廠(chǎng)接口請(qǐng)求所需要的產(chǎn)品。
通過(guò)使用抽象工廠(chǎng)模式,可以處理具有相同(或者相似)等級(jí)結(jié)構(gòu)中的多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象的創(chuàng)建問(wèn)題。如下圖所示:
根據(jù)產(chǎn)品角色的結(jié)構(gòu)圖,就不難給出工廠(chǎng)角色的結(jié)構(gòu)設(shè)計(jì)圖。
可以看出,每一個(gè)工廠(chǎng)角色都有兩個(gè)工廠(chǎng)方法,分別負(fù)責(zé)創(chuàng)建分屬不同產(chǎn)品等級(jí)結(jié)構(gòu)的產(chǎn)品對(duì)象。
抽象工廠(chǎng)的功能是為一系列相關(guān)對(duì)象或相互依賴(lài)的對(duì)象創(chuàng)建一個(gè)接口。一定要注意,這個(gè)接口內(nèi)的方法不是任意堆砌的,而是一系列相關(guān)或相互依賴(lài)的方法。比如上面例子中的主板和CPU,都是為了組裝一臺(tái)電腦的相關(guān)對(duì)象。不同的裝機(jī)方案,代表一種具體的電腦系列。
由于抽象工廠(chǎng)定義的一系列對(duì)象通常是相關(guān)或相互依賴(lài)的,這些產(chǎn)品對(duì)象就構(gòu)成了一個(gè)產(chǎn)品族,也就是抽象工廠(chǎng)定義了一個(gè)產(chǎn)品族。
這就帶來(lái)非常大的靈活性,切換產(chǎn)品族的時(shí)候,只要提供不同的抽象工廠(chǎng)實(shí)現(xiàn)就可以了,也就是說(shuō)現(xiàn)在是以一個(gè)產(chǎn)品族作為一個(gè)整體被切換。
核心
先上一張圖:
我們還是以苦逼的程序猿為例來(lái)說(shuō)抽象工廠(chǎng)模式的一些核心概念。通過(guò)上圖你可以發(fā)現(xiàn),橫縱二維坐標(biāo)可以確定平面上一個(gè)唯一的點(diǎn),這也就是抽象工廠(chǎng)的核心。
產(chǎn)品等級(jí)結(jié)構(gòu):就是繼承結(jié)構(gòu)。就像上面Android,IOS,PHP這些技能繼承自一個(gè)抽象的技能類(lèi)(譬如前面的ICode),這個(gè)抽象類(lèi)與這些子類(lèi)構(gòu)成了產(chǎn)品等級(jí)結(jié)構(gòu)。 同理的Android書(shū),C語(yǔ)言書(shū),腳本書(shū)繼承自一個(gè)工具書(shū)類(lèi),這個(gè)工具書(shū)抽象類(lèi)與這些子類(lèi)構(gòu)成了等級(jí)結(jié)構(gòu)。
產(chǎn)品族:抽象工廠(chǎng)模式中的產(chǎn)品族官方定義是指由同一個(gè)工廠(chǎng)生產(chǎn)的,位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中的一組產(chǎn)品。 譬如上面的Android位于技能等級(jí)結(jié)構(gòu)中,Android書(shū)位于工具書(shū)等級(jí)結(jié)構(gòu)中,Android技能和Android書(shū)是位于不同產(chǎn)品結(jié)構(gòu)的一組產(chǎn)品,但是任何一個(gè)程序猿都需要具備技能和工具書(shū), 譬如一個(gè)Android程序猿需要有Android技能及Android書(shū),所以這個(gè)Android程序猿就是一個(gè)產(chǎn)品族。
概念: 提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)須指定它們具體的類(lèi)。抽象工廠(chǎng)模式又稱(chēng)為Kit模式,它是一種對(duì)象創(chuàng)建型模式。
重點(diǎn): 抽象工廠(chǎng)模式結(jié)構(gòu)重要核心模塊:
抽象工廠(chǎng):
聲明一組用于創(chuàng)建一族產(chǎn)品的方法,每一個(gè)方法對(duì)應(yīng)一種產(chǎn)品。
具體工廠(chǎng):
實(shí)現(xiàn)了在抽象工廠(chǎng)中聲明的創(chuàng)建產(chǎn)品的方法,生成一組具體產(chǎn)品,這些產(chǎn)品構(gòu)成了一個(gè)產(chǎn)品族,每一個(gè)產(chǎn)品都位于某個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中。
抽象產(chǎn)品:
它為每種產(chǎn)品聲明接口,在抽象產(chǎn)品中聲明了產(chǎn)品所具有的業(yè)務(wù)方法。
具體產(chǎn)品:
定義具體工廠(chǎng)生產(chǎn)的具體產(chǎn)品對(duì)象,實(shí)現(xiàn)抽象產(chǎn)品接口中聲明的業(yè)務(wù)方法。
使用場(chǎng)景:
當(dāng)需要?jiǎng)?chuàng)建的對(duì)象是一系列相互關(guān)聯(lián)或相互依賴(lài)的產(chǎn)品族時(shí),便可以使用抽象工廠(chǎng)模式。 大白話(huà)意思就是一個(gè)繼承體系中,如果存在著多個(gè)等級(jí)結(jié)構(gòu)(即存在著多個(gè)抽象類(lèi),像上面的技能與工具書(shū)), 并且分屬各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類(lèi)之間存在著一定的關(guān)聯(lián)或者約束,就可以使用抽象工廠(chǎng)模式。當(dāng)然了, 同樣的道理就是如果各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類(lèi)之間不存在關(guān)聯(lián)或約束,則使用多個(gè)獨(dú)立的工廠(chǎng)來(lái)對(duì)產(chǎn)品進(jìn)行創(chuàng)建。
程序?qū)嵗?br /> 如下實(shí)例就是上圖何如上文字解釋的實(shí)現(xiàn)代碼,具體不再解釋?zhuān)?br />
package yanbober.github.io;
/*技能等級(jí)結(jié)構(gòu)部分*/
interface ICode {
void coding();
}
class CodeImplAndroid implements ICode {
@Override
public void coding() {
System.out.println("Coding Android!");
}
}
class CodeImplPHP implements ICode {
@Override
public void coding() {
System.out.println("Coding PHP!");
}
}
/*工具書(shū)等級(jí)結(jié)構(gòu)*/
interface INeedBook {
void lookBook();
}
class NeedBookImplAndroid implements INeedBook {
@Override
public void lookBook() {
System.out.println("Look Android Book!");
}
}
class NeedBookImplPHP implements INeedBook {
@Override
public void lookBook() {
System.out.println("Look PHP Book!");
}
}
/*產(chǎn)品族*/
interface IAbstractFactory {
ICode getCodingSkill();
INeedBook getNeedBook();
}
class FactoryImplAndroid implements IAbstractFactory {
@Override
public ICode getCodingSkill() {
return new CodeImplAndroid();
}
@Override
public INeedBook getNeedBook() {
return new NeedBookImplAndroid();
}
}
class FactoryImplPHP implements IAbstractFactory {
@Override
public ICode getCodingSkill() {
return new CodeImplPHP();
}
@Override
public INeedBook getNeedBook() {
return new NeedBookImplPHP();
}
}
public class Main {
public static void main(String[] args) {
IAbstractFactory factory = new FactoryImplAndroid();
ICode code = factory.getCodingSkill();
INeedBook book = factory.getNeedBook();
code.coding();
book.lookBook();
factory = new FactoryImplPHP();
code = factory.getCodingSkill();
book = factory.getNeedBook();
code.coding();
book.lookBook();
}
}
技巧Tips:依舊可以使用配置與反射實(shí)現(xiàn)自動(dòng)適應(yīng)。
總結(jié)一把
抽象工廠(chǎng)模式的優(yōu)點(diǎn):
和前面一樣,隔離具體類(lèi)的生成,使客戶(hù)并不需要知道什么被創(chuàng)建。
增加新的產(chǎn)品族很方便,無(wú)須修改已有系統(tǒng),符合“開(kāi)閉原則”。
抽象工廠(chǎng)模式的缺點(diǎn):
增加新的產(chǎn)品等級(jí)結(jié)構(gòu)麻煩,需要對(duì)原有系統(tǒng)進(jìn)行較大的修改,甚至需要修改抽象層代碼,違背“開(kāi)閉原則”。
- iOS App設(shè)計(jì)模式開(kāi)發(fā)中對(duì)interpreter解釋器模式的運(yùn)用
- 詳解iOS App設(shè)計(jì)模式開(kāi)發(fā)中對(duì)于享元模式的運(yùn)用
- iOS App設(shè)計(jì)模式開(kāi)發(fā)中對(duì)建造者模式的運(yùn)用實(shí)例
- iOS App設(shè)計(jì)模式開(kāi)發(fā)中對(duì)迭代器模式的使用示例
- iOS App的設(shè)計(jì)模式開(kāi)發(fā)中對(duì)State狀態(tài)模式的運(yùn)用
- 詳解iOS應(yīng)用開(kāi)發(fā)中使用設(shè)計(jì)模式中的抽象工廠(chǎng)模式
- 實(shí)例解析設(shè)計(jì)模式中的外觀(guān)模式在iOS App開(kāi)發(fā)中的運(yùn)用
- 設(shè)計(jì)模式開(kāi)發(fā)中的備忘錄模式在iOS應(yīng)用開(kāi)發(fā)中的運(yùn)用實(shí)例
- 深入解析設(shè)計(jì)模式中的裝飾器模式在iOS應(yīng)用開(kāi)發(fā)中的實(shí)現(xiàn)
- 舉例講解設(shè)計(jì)模式中的原型模式在iOS應(yīng)用開(kāi)發(fā)中的作用
相關(guān)文章
IOS App圖標(biāo)和啟動(dòng)畫(huà)面尺寸詳細(xì)介紹
這篇文章主要介紹了IOS App圖標(biāo)和啟動(dòng)畫(huà)面尺寸詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-02-02iOS開(kāi)發(fā)中使用UIScrollView實(shí)現(xiàn)圖片輪播和點(diǎn)擊加載
這篇文章主要介紹了iOS開(kāi)發(fā)中使用UIScrollView實(shí)現(xiàn)圖片輪播和點(diǎn)擊加載的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12xcode 詳解創(chuàng)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法
這篇文章主要介紹了xcode 詳解創(chuàng)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法的相關(guān)資料,這里對(duì)創(chuàng)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的方法詳細(xì)介紹,需要的朋友可以參考下2017-01-01iOS 禁止按鈕在一定時(shí)間內(nèi)連續(xù)點(diǎn)擊
本文主要介紹了iOS中禁止按鈕在一定時(shí)間內(nèi)連續(xù)點(diǎn)擊的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02iOS?Lotusoot模塊化工具應(yīng)用的動(dòng)態(tài)思路
項(xiàng)目的不斷更迭,導(dǎo)致項(xiàng)目越來(lái)越大,越來(lái)越臃腫,為了讓項(xiàng)目更加條理,需要對(duì)項(xiàng)目進(jìn)行模塊化處理,為了減少模塊之間的耦合,于是就有了Lotusoot這個(gè)工具2022-08-08