Android編程設計模式之工廠方法模式實例詳解
本文實例講述了Android編程設計模式之工廠方法模式。分享給大家供大家參考,具體如下:
一、介紹
工廠方法模式(Factory Pattern),是創(chuàng)建型設計模式之一。工廠方法模式是一種結構簡單的模式,其在我們平時開發(fā)中應用很廣泛,也許你并不知道,但是你已經(jīng)使用了無數(shù)次該模式了,如Android中的Activity里的各個生命周期方法,以onCreate方法為例,它就可以看作是一個工廠方法,我們在其中可以構造我們的View并通過setContentView返回給framework處理等,相關內(nèi)容我們下面再講,先看看工廠方法模式定義。
二、定義
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪個類。
三、使用場景
在任何需要生成復雜對象的地方,都可以使用工廠方法模式。復雜對象適合使用工廠模式,用new就可以完成創(chuàng)建的對象無需使用工廠模式。
四、模式的簡單實現(xiàn)
抽象產(chǎn)品類:
public abstract class Product {
/**
* 產(chǎn)品類的抽象方法
* 由具體的產(chǎn)品類去實現(xiàn)
* */
public abstract void method();
}
具體產(chǎn)品類A:
public class ConcreteProductA extends Product {
@Override
public void method() {
System.out.println("我是具體的產(chǎn)品A");
}
}
具體產(chǎn)品類B:
public class ConcreteProductB extends Product {
@Override
public void method() {
System.out.println("我是具體的產(chǎn)品B");
}
}
抽象工廠類:
public abstract class Factory {
/**
* 抽象工廠方法
* 具體由子類實現(xiàn)
*
* @return 具體的產(chǎn)品對象
* */
public abstract Product createProduct();
}
具體工廠類:
public class ConcreteFactory extends Factory {
/**
* 具體工廠類
* */
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
客戶類:
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
product.method();
}
}
結果:
我是具體的產(chǎn)品A
這里的幾個角色都很簡單,主要分為四大模塊,一是抽象工廠,其為工廠方法模式的核心;二是具體工廠,其實現(xiàn)了具體的業(yè)務邏輯;三是抽象產(chǎn)品,是工廠方法模式所創(chuàng)建的產(chǎn)品的父類;四是具體產(chǎn)品,為實現(xiàn)抽象產(chǎn)品的某個具體產(chǎn)品的對象。
上述的代碼中我們在Client類中構造了一個工廠對象,并通過其生產(chǎn)了一個產(chǎn)品對象,這里我們得到的產(chǎn)品對象是ConcreteProductA的實例,如果想得到ConcreteProductB的實例,更改ConcreteFactory中的邏輯即可:
public class ConcreteFactory extends Factory {
/**
* 具體工廠類
* */
@Override
public Product createProduct() {
//return new ConcreteProductA();
return new ConcreteProductB();
}
}
這種方式比較常見,需要哪一個產(chǎn)品就生產(chǎn)哪一個,有時候也可以利用反射的方式更簡潔的來生產(chǎn)具體產(chǎn)品對象,此時,需要在工廠方法的參數(shù)列表中傳入一個Class類來決定是哪一個產(chǎn)品類:
public abstract class Factory {
/**
* 抽象工廠方法
* 具體由子類實現(xiàn)
*
* @param clz 產(chǎn)品對象類類型
*
* @return 具體的產(chǎn)品對象
* */
public abstract <T extends Product> T createProduct(Class<T> clz);
}
對于具體的工廠類,則通過反射獲取類的示例即可:
public class ConcreteFactory extends Factory {
/**
* 具體工廠類
* */
@SuppressWarnings("unchecked")
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product product = null;
try {
product = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T)product;
}
}
最后在看看Client中的實現(xiàn):
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
Product product = factory.createProduct(ConcreteProductB.class);
product.method();
}
}
需要哪一個類的對象就傳入哪一個類的類型即可,這種方法比較簡潔、動態(tài),如果你不喜歡這種方式,也可以嘗試為每一個產(chǎn)品都定義一個具體的工廠,各司其職。
public class ConcreteFactoryA extends Factory {
/**
* 具體工廠類
**/
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class ConcreteFactoryB extends Factory {
/**
* 具體工廠類
**/
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.method();
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.method();
}
}
像這樣擁有多個工廠的方式我們稱為多工廠方法模式,同樣的,回到我們最初的那個工廠方法模式,當我們的工廠只有一個的時候,我們還是為工廠提供了一個抽象類,那么,我們是否可以將其簡化掉呢?如果確定你的工廠類只有一個,那么簡化掉抽象類是肯定沒問題的,我們只需要將對應的工廠方法改為靜態(tài)方法即可:
public class Factory {
/**
* 具體工廠類
**/
@Override
public static Product createProduct() {
return new ConcreteProductA();
}
}
像這樣的方式又稱為簡單工廠模式或靜態(tài)工廠模式,它是工廠方法模式的一個弱化版本。
其實到這里大家應該可以發(fā)現(xiàn),工廠方法模式是完全符合設計原則的,其降低了對象之間的耦合度,而且,工廠方法模式依賴于抽象的架構,其將實例化的任務交由子類去完成,有非常好的擴展性。
五、Android源碼中的工廠方法模式
Activity的各種生命周期
ArrayList和HashSet
六、總結
優(yōu)點:
工廠方法模式完全符合設計原則,降低了對象之間的耦合。高層模塊只需要知道產(chǎn)品的抽象類,其他的實現(xiàn)都不需要關心。
良好的封裝性,代碼結構清晰。擴展性好。
缺點:
每次我們?yōu)楣S方法模式添加新的產(chǎn)品時就要編寫一個新的產(chǎn)品類。同時還要引入抽象層,這必然會導致類結構的復雜化,所以,在某些情況比較簡單時,是否要使用工廠模式,需要設計者權衡利弊了。
更多關于Android相關內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結》
希望本文所述對大家Android程序設計有所幫助。
相關文章
Android實現(xiàn)為ListView同時設置點擊時的背景和點擊松手之后的背景
這篇文章主要介紹了Android實現(xiàn)為ListView同時設置點擊時的背景和點擊松手之后的背景,以實例形式較為詳細的分析了界面元素與功能的實現(xiàn)技巧,非常具有實用價值,需要的朋友可以參考下2015-02-02
Android開發(fā) 旋轉屏幕導致Activity重建解決方法
Android開發(fā)文檔上專門有一小節(jié)解釋這個問題。簡單來說,Activity是負責與用戶交互的最主要機制,接下來為您詳細介紹2012-11-11
Android 判斷SIM卡屬于哪個移動運營商的實現(xiàn)代碼
有時候我們需要在Android中獲取本機網(wǎng)絡提供商呢,這里簡單分享下,方便需要的朋友2013-05-05
Android中Handler實現(xiàn)倒計時的兩種方式
本篇文章主要介紹了Android中Handler實現(xiàn)倒計時的兩種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
android TextView中識別多個url并分別點擊跳轉方法詳解
在本篇文章里小編給大家整理的是關于android TextView中識別多個url并分別點擊跳轉方法詳解,需要的朋友們可以學習參考下。2019-08-08

