日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android设计模式之——工厂方法模式

發(fā)布時間:2023/12/13 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android设计模式之——工厂方法模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、介紹

工廠方法模式(Factory Pattern),是創(chuàng)建型設(shè)計模式之一。工廠方法模式是一種結(jié)構(gòu)簡單的模式,其在我們平時開發(fā)中應(yīng)用很廣泛,也許你并不知道,但是你已經(jīng)使用了無數(shù)次該模式了,如Android中的Activity里的各個生命周期方法,以onCreate方法為例,它就可以看作是一個工廠方法,我們在其中可以構(gòu)造我們的View并通過setContentView返回給framework處理等,相關(guān)內(nèi)容我們下面再講,先看看工廠方法模式定義。

二、定義

定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪個類。

三、使用場景

在任何需要生成復(fù)雜對象的地方,都可以使用工廠方法模式。復(fù)雜對象適合使用工廠模式,用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 {@Overridepublic void method() {System.out.println("我是具體的產(chǎn)品A");} }

具體產(chǎn)品類B:

public class ConcreteProductB extends Product {@Overridepublic 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 {/*** 具體工廠類* */@Overridepublic Product createProduct() {return new ConcreteProductA();} }

客戶類:

public class Client {public static void main(String[] args) {Factory factory = new ConcreteFactory();Product product = factory.createProduct();product.method();} }

結(jié)果:

我是具體的產(chǎn)品A

這里的幾個角色都很簡單,主要分為四大模塊,一是抽象工廠,其為工廠方法模式的核心;二是具體工廠,其實現(xiàn)了具體的業(yè)務(wù)邏輯;三是抽象產(chǎn)品,是工廠方法模式所創(chuàng)建的產(chǎn)品的父類;四是具體產(chǎn)品,為實現(xiàn)抽象產(chǎn)品的某個具體產(chǎn)品的對象。

上述的代碼中我們在Client類中構(gòu)造了一個工廠對象,并通過其生產(chǎn)了一個產(chǎn)品對象,這里我們得到的產(chǎn)品對象是ConcreteProductA的實例,如果想得到ConcreteProductB的實例,更改ConcreteFactory中的邏輯即可:

public class ConcreteFactory extends Factory {/*** 具體工廠類* */@Overridepublic 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")@Overridepublic <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 {/*** 具體工廠類**/@Overridepublic Product createProduct() {return new ConcreteProductA();} }public class ConcreteFactoryB extends Factory {/*** 具體工廠類**/@Overridepublic 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();} }

像這樣擁有多個工廠的方式我們稱為多工廠方法模式,同樣的,回到我們最初的那個工廠方法模式,當(dāng)我們的工廠只有一個的時候,我們還是為工廠提供了一個抽象類,那么,我們是否可以將其簡化掉呢?如果確定你的工廠類只有一個,那么簡化掉抽象類是肯定沒問題的,我們只需要將對應(yīng)的工廠方法改為靜態(tài)方法即可:

public class Factory {/*** 具體工廠類**/@Overridepublic static Product createProduct() {return new ConcreteProductA();} }

像這樣的方式又稱為簡單工廠模式或靜態(tài)工廠模式,它是工廠方法模式的一個弱化版本。

其實到這里大家應(yīng)該可以發(fā)現(xiàn),工廠方法模式是完全符合設(shè)計原則的,其降低了對象之間的耦合度,而且,工廠方法模式依賴于抽象的架構(gòu),其將實例化的任務(wù)交由子類去完成,有非常好的擴展性。

五、Android源碼中的工廠方法模式

  • Activity的各種生命周期

  • ArrayList和HashSet

六、總結(jié)

優(yōu)點:

  • 工廠方法模式完全符合設(shè)計原則,降低了對象之間的耦合。高層模塊只需要知道產(chǎn)品的抽象類,其他的實現(xiàn)都不需要關(guān)心。

  • 良好的封裝性,代碼結(jié)構(gòu)清晰。擴展性好。

缺點:

  • 每次我們?yōu)楣S方法模式添加新的產(chǎn)品時就要編寫一個新的產(chǎn)品類。同時還要引入抽象層,這必然會導(dǎo)致類結(jié)構(gòu)的復(fù)雜化,所以,在某些情況比較簡單時,是否要使用工廠模式,需要設(shè)計者權(quán)衡利弊了。

總結(jié)

以上是生活随笔為你收集整理的Android设计模式之——工厂方法模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久精品久久久 | 精品二区在线观看 | 精品久久a | 99re热在线视频 | 中文字幕日韩欧美一区二区 | 老司机av影院 | 少妇无码一区二区三区免费 | 97人妻精品一区二区免费 | 国产正在播放 | xxxx日韩 | 最好看的2019年中文视频 | 欧美绿帽交换xxx | h部分肌肉警猛淫文 | 国产精品theporn动漫 | 色优久久 | 麻豆精品网站 | 亚洲经典一区二区三区四区 | 色噜噜亚洲 | 欧美激情三级 | 色呦呦国产精品 | 都市乱淫 | 成人宗合网 | 97精品超碰一区二区三区 | 浪潮av一区二区三区 | 国产精品久久久久桃色tv | 亚洲免费三区 | 一级片免费在线观看 | 午夜专区 | 久国久产久精永久网页 | 成人免费xxxxx在线观看 | 成人αv| 五月天一区二区 | 黄色一级录像片 | 人妖一级片 | 校园春色欧美 | 综合99| 国产精品久久久久久久久久妞妞 | 亚洲精品久久夜色撩人男男小说 | 精品国产一区二区三区性色av | 少妇熟女视频一区二区三区 | 蜜桃av一区 | 精品人妻伦一二三区久久 | 三级在线观看网站 | 美女三区 | 久久人人澡 | 日韩一区二区三区三四区视频在线观看 | 亚洲天码中字 | 激情av综合| 午夜有码 | 欧美成人手机在线视频 | av网站免费在线看 | 国产麻豆乱码精品一区二区三区 | 中文字幕在线观看亚洲 | 成人av电影在线观看 | 一二三在线视频 | 黄黄视频在线观看 | 亚洲不卡影院 | 国产成人在线观看免费网站 | 91久久国语露脸精品国产高跟 | 少妇被黑人到高潮喷出白浆 | 少妇高潮一区二区三区99欧美 | 国产一卡二卡 | 超能一家人电影免费喜剧在线观看 | 91小宝寻花一区二区三区 | 国产乱淫a∨片免费视频 | 竹菊影视一区二区三区 | 色婷婷91 | 都市乱淫| 成人亚洲一区 | 午夜视频91 | xx视频在线| 国产又粗又猛又爽又黄91精品 | av超碰 | 色妞综合网| 四季av日韩精品一区 | 依依av| 亚洲欧美精品一区二区 | 国产极品美女高潮无套在线观看 | а√天堂资源官网在线资源 | 久热精品在线 | 亚洲一区二区三区乱码 | 亚洲大色网 | 精品欧美一区二区三区 | 亚洲经典一区二区三区 | 草草色 | 精品国产999 | 88av在线视频| 成人中文在线 | 91高清在线 | 99热只有这里有精品 | www.av网 | 美女扒开尿口让男人桶 | 亚洲视频成人 | 永久免费视频网站 | 欧美在线视频一区二区三区 | 国产婷婷色一区二区三区 | 亚洲专区视频 | 亚洲欧洲精品一区二区 | 欧美日韩在线观看免费 |