Android設計模式之——抽象工廠模式

一、介紹

抽象工廠模式(Abstract Factory Pattern),也是創建型設計模式之一。前一節我們已經了解了工廠方法模式,那么這個抽象工廠又是怎么一回事呢?大家聯想一下現實生活中的工廠肯定都是具體的,也就是說每個工廠都會生產某一種具體的產品,那么抽象工廠意味著生產出來的產品是不確定的,那這豈不是很奇怪?抽象工廠模式起源于以前對不同操作系統的圖形化解決方案,如不同操作系統中的按鈕和文本框控件其實現不同,展示效果也不一樣,對于每一個操作系統,其本身就構成一個產品類,而按鈕與文本框控件也構成一個產品類,兩種產品類兩種變化,各自有自己的特性,如Android中的Button和TextView,iOS中的Button和TextView,Window Phone中的Button和TextView等。

二、定義

為創建一組相關或者是相互依賴的對象提供一個接口,而不需要指定它們的具體類。

三、使用場景

一個對象族有相同的約束時可以使用抽象工廠模式。是不是聽起來很抽象?舉個例子,Android、iOS、Window Phone下都有短信軟件和撥號軟件,兩者都屬于Software軟件的范疇,但是,它們所在的操作系統平臺不一樣,即便是同一家公司出品的軟件,其代碼的實現邏輯也是不一樣的,這時候就可以考慮使用抽象工廠方法模式來產生Android、iOS、Window Phone下的短信軟件和撥號軟件。

四、抽象工廠模式的UML類圖

UML類圖:

這里寫圖片描述

雖然抽象工廠方法模式的種類繁多,但是,主要還是分為4類:

  • AbstractFactory:抽象工廠角色,它聲明了一組用于創建一種產品的方法,每一個方法對應一種產品。

  • ConcreteFactory:具體的工廠角色,它實現了在抽象工廠中定義的創建產品的方法,生成一組具體產品,這些產品構成了一個產品種類,每一個產品都位于某個產品等級結構中。

  • AbstractProduct:抽象產品角色,它為每種產品聲明接口。

  • ConcreteProduct:具體產品角色,它定義具體工廠生產的具體產品對象,實現抽象產品接口中聲明的業務方法。

五、簡單實現

以車廠生產汽車零部件為例,A、B兩家車廠分別生產不同的輪胎、發動機、制動系統。雖然生產的零件不同,型號不同。但是根本上都有共同的約束,就是輪胎、發動機、制動系統。

輪胎相關類:

public interface ITire {/*** 輪胎 */void tire();
}public class NormalTire implements ITire{@Overridepublic void tire() {System.out.println("普通輪胎");}
}public class SUVTire implements ITire{@Overridepublic void tire() {System.out.println("越野輪胎");}
}

發動機相關類:

public interface IEngine {/***發動機 */void engine();
}public class DomesticEngine implements IEngine{@Overridepublic void engine() {System.out.println("國產發動機");}
}public class ImportEngine implements IEngine{@Overridepublic void engine() {System.out.println("進口發動機");}
}

制動系統相關類:

public interface IBrake {/***制動系統 */void brake();
}public class NormalBrake implements IBrake{@Overridepublic void brake() {System.out.println("普通制動");}
}public class SeniorBrake implements IBrake{@Overridepublic void brake() {System.out.println("高級制動");}
}

抽象車廠類:

public abstract class CarFactory {/*** 生產輪胎* * @return 輪胎* */public abstract ITire createTire();/*** 生產發動機* * @return 發動機* */public abstract IEngine createEngine();/*** 生產制動系統* * @return 制動系統* */public abstract IBrake createBrake();}

A車廠:

public class AFactory extends CarFactory{@Overridepublic ITire createTire() {return new NormalTire();}@Overridepublic IEngine createEngine() {return new DomesticEngine();}@Overridepublic IBrake createBrake() {return new NormalBrake();}
}

B車廠:

public class BFactory extends CarFactory{@Overridepublic ITire createTire() {return new SUVTire();}@Overridepublic IEngine createEngine() {return new ImportEngine();}@Overridepublic IBrake createBrake() {return new SeniorBrake();}
}

客戶類:

public class Client {public static void main(String[] args) {//A車廠CarFactory factoryA = new AFactory();factoryA.createTire().tire();factoryA.createEngine().engine();factoryA.createBrake().brake();System.out.println("---------------");//B車廠CarFactory factoryB = new BFactory();factoryB.createTire().tire();factoryB.createEngine().engine();factoryB.createBrake().brake();}
}

結果:

普通輪胎
國產發動機
普通制動
------------------
越野輪胎
進口發動機
高級制動

可以看出上面模擬了兩個車廠,如果有了C廠、D廠,各自廠家生產的零部件型號種類又不相同,那么我們創建的類文件就會翻倍。這也是抽象工廠模式的一個弊端,所以實際開發中要權衡使用。

六、與工廠方法模式的區別

上一節有介紹了工廠方法模式,那么他們的區別是什么?抽象工廠模式是工廠方法模式的升級版本。對比如下:

這里寫圖片描述

七、源碼中的實現

抽象工廠模式在Android源碼中使用較少,因為很少會出現多個產品種類的情況,大部分使用工廠方法模式即可解決。

MediaPlayer

MediaPlayer Factory分別會生成4個不同的MediaPlayer基類:StagefrightPlayer、NuPlayerDriver、MidiFile和TestPlayerStub,四者均繼承于MediaPlayerBase。

八、總結

優點:

  • 分離接口與實現,客戶端使用抽象工廠來創建需要的對象,而客戶端根本就不知道具體的實現是誰,客戶端只是面向產品的接口編程而已,使其從具體的產品實現中解耦,同時基于接口與實現分離,使抽象該工廠方法模式在切換產品類時更加靈活、容易。

缺點:

  • 一是對類文件的爆炸性增加

  • 二是不太容易擴展新的產品類

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447025.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447025.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447025.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android設計模式之——策略模式

一、介紹 在軟件開發中也常常遇到這樣的情況:實現某一個功能可以有多種算法或者策略,我們根據實際情況選擇不同的算法或者策略來完成該功能。例如,排序算法,可以使用插入排序、歸并排序、冒泡排序等。 針對這種情況,…

密碼學在區塊鏈隱私保護中的應用學習

身份隱私保護技術 混淆服務 混淆服務的目的在于混淆消息雙方的聯系(如 圖 2 所示)。當發送方需要告知接收方消息 M 時, 它會首先用接收方的公鑰 KB 加密 M,并在密文后 附帶真實接收地址 R。為了借助第三方(圖 2 中的…

值類型和引用類型的區別

一、定義 引用類型表示你操作的數據是同一個,也就是說當你傳一個參數給另一個方法時,你在另一個方法中改變這個變量的值,那么調用這個方法是傳入的變量的值也將改變。 值類型表示復制一個當前變量傳給方法,當你在這個方法中改變…

面向區塊鏈的高效物化視圖維護和可信查詢論文學習

物化視圖介紹 如何維護物化視圖仍舊是一個開放問題.在關系數據庫中,增量刷新的物化視圖維護策略可劃分為立即維護和延遲維護兩大類.立即維護策略的優點是實現較為簡單,在單數據源下不 存在一致性問題;然而該策略將物化視圖維護過程嵌入到更新事務之中,延長了更新事務的提交時間…

Java基礎知識(一)

一、接口 類描述了一個實體,包括實體的狀態,也包括實體可能發出的動作。 接口定義了一個實體可能發出的動作。但是只是定義了這些動作的原型,沒有實現,也沒有任何狀態信息。 所以接口有點象一個規范、一個協議,是一個…

密碼學數字信封的介紹

對稱密碼和非對稱密碼 對稱密碼:加解密運算非常快,適合處理大批量數據,但其密碼的分發與管理比較復雜非對稱密碼:公鑰和私鑰分離,非常適合密鑰的分發和管理 數字信封的定義 如果將對稱密碼算法和非對稱密碼算法的優點…

Android設計模式之——狀態模式

一、介紹 狀態模式中的行為是由狀態來決定的,不同的狀態下有不同的行為。狀態模式和策略模式的結構幾乎完全一樣,但它們的目的、本質卻完全不一樣。狀態模式的行為是平行的、不可替換的,策略模式的行為是彼此獨立、可相互替換的。用一句話來…

Android設計模式之——責任鏈模式

一、介紹 責任鏈模式(Iterator Pattern),是行為型設計模式之一。什么是”鏈“?我們將多個節點首尾相連所構成的模型稱為鏈,比如生活中常見的鎖鏈,就是由一個個圓角長方形的鐵環串起來的結構。對于鏈式結構…

目前基于區塊鏈的檔案防篡改系統的設計如何實現防篡改

架構設計圖 分析 為了保障檔案數據的安全性和隱私性,存儲檔案附件和檔案屬性存儲加密存儲在私有IPFS集群,檔案的IPFS地址和數字指紋存儲在私有區塊鏈上。公有區塊鏈定期存儲和檢查私有區塊鏈最新不可逆區塊的高度和哈希值,以保障私有區塊鏈上…

IPFS的文件存儲模式

IPFS是如何進行文件存儲的 IPFS采用的索引結構是DHT(分布式哈希表),數據結構是MerkleDAG(Merkle有向無環圖) DHT(分布式哈希表) 參考鏈接MerkleDAG(Merkle有向無環圖) 參考鏈接MerkleDAG功能…

Android設計模式之——解釋器模式

一、介紹 解釋器模式(Interpreter Pattern)是一種用的比較少的行為型模式,其提供了一種解釋語言的語法或表達式的方式,該模式定義了一個表達式接口,通過該接口解釋一個特定的上下文。在這么多的設計模式中&#xff0c…

在Docker里面安裝Ubuntu,并且使用ssh進行連接

創建Ubuntu鏡像 1,拉取Ubuntu系統的鏡像 docker pull ubuntu2、查看拉取是否成功 docker images3,運行容器 docker run --name 新建的容器的名字 -ti -v /AAA:/BBB -d -p 3316:22 ubuntu(這個是鏡像的名字)宿主機根目錄中的AAA文件夾就映射到了容器…

Android設計模式之——命令模式

一、介紹 命令模式(Command Pattern),是行為型設計模式之一。命令模式相對于其他的設計模式來說并沒有那么多的條條框框,其實它不是一個很”規范“的模式,不過,就是基于這一點,命令模式相對于其…

C++ 序列化和反序列化學習

定義 程序員在編寫應用程序的時候往往需要將程序的某些數據存儲在內存中,然后將其寫入某個文件或是將它傳輸到網絡中的另一臺計算機上以實現通訊。這些過程將會涉及到程序數據轉化成能被存儲并傳輸的格式,因此被稱為“序列化”(Serializatio…

Android設計模式之——觀察者模式

一、介紹 觀察者模式是一個使用率非常高的模式,它最常用的地方是GUI系統、訂閱——發布系統。因為這個模式的一個重要作用就是解耦,將被觀察者和觀察者解耦,使得它們之間的依賴性更小,甚至做到毫無依賴。以GUI系統來說&#xff0…

Android設計模式之——備忘錄模式

一、介紹 備忘錄模式是一種行為模式,該模式用于保存對象當前狀態,并且在之后可以再次恢復到此狀態,這有點像我們平時說的”后悔藥“。備忘錄模式實現的方式需要保證被保存的對象狀態不能被對象從外部訪問,目的是為了保護好被保存…

c++ memory 頭文件詳細介紹

類 指針特征 pointer_traits (C11) 提供關于指針式類型的信息 (類模板) 垃圾收集器支持 pointer_safety (C11) 列出指針安全模式 (枚舉) 分配器 allocator 默認的分配器 (類模板) allocator_traits (C11) 提供關于分配器類型的信息 (類模板) allocator_arg_t (C11) 標簽類型…

C++ using的三種使用策略以及具體的用法

Using的使用方法 1,命名空間的使用 為了防止代碼沖突,都會使用到命名空間。假設這樣一種情況,當一個班上有兩個名叫 Zara 的學生時,為了明確區分他們,我們在使用名字之外,不得不使用一些額外的信息&#…

Android設計模式之——迭代器模式

一、介紹 迭代器模式(Iterator Pattern)又稱為游標(Cursor)模式,是行為型設計模式之一。迭代器模式算是一個比較古老的設計模式,其源于對容器的訪問,比如Java中的List、Map、數組等&#xff0c…

Android設計模式之——模板方法模式

一、介紹 在面向對象開發過程中,通常會遇到這樣的一個問題,我們知道一個算法所需的關鍵步驟,并確定了這些步驟的執行順序,但是,某些步驟的具體實現是未知的,或者說某些步驟的實現是會隨著環境的變化而改變…