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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

抽象工厂模式升级版————泛型化实现

發布時間:2025/3/12 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 抽象工厂模式升级版————泛型化实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

今天回看之前總結的抽象工廠模式的實現《Java常用設計模式————抽象工廠模式》,聚焦于抽象工廠模式的缺點,試著改進了一下。

回顧一下抽象工廠模式的缺點:

在添加新的產品類型時,難以擴展抽象工廠來生產新種類的產品。

這是怎么回事呢?原來,老套的實現方式是為每種類型的產品都創建一個具體的工廠類,這個類只生產一種特定類型的產品。因此,當有新的類型的產品加入系統時,就必須添加一個對應的工廠類來支持這類產品,不僅不利于擴展,而且會增加大量的工廠類。

例如之前會有如下兩個具體產品的工廠類來生產對應類型的產品:

今天試著使用泛型的方式,得出了一種更加通用的抽象工廠實現方式。可以避免大量工廠的再造。

實現

為了本篇文章的完整性,依然將全部實現過程貼出,各位同學可以與《Java常用設計模式————抽象工廠模式》進行比較閱讀。

一、抽象化產品族

產品族的概念其實很好理解,每種類型的產品就是一個產品族,它包含多種不同的表現形式,例如汽車就是一個產品族,它包含卡車、轎車等,這些具體的產品隸屬于汽車這個產品族。

如圖所示,創建了電視產品族和汽車產品族。電視產品族包括索尼電視夏普電視:

public interface Television {void play(); } public class SonyTV implements Television{@Overridepublic void play() {System.out.println("SonyTV playing...");} } public class SharpTV implements Television{@Overridepublic void play() {System.out.println("SharpTV playing...");} }

汽車產品族包括奧迪汽車奔馳汽車

public interface Car {void run(); } public class Audi implements Car{@Overridepublic void run() {System.out.println("Audi running...");} } public class Benz implements Car{@Overridepublic void run() {System.out.println("Benz running...");} }

二、創建抽象工廠及泛型工廠

抽象工廠是具體工廠的進一步抽象化,在原版的抽象工廠模式實現中,會存在多個具體的產品工廠,而在本例中,將會以泛型化的實現類來代替它們,而且即便再增加新的產品族也不需要修改泛型工廠:

public interface Factory<T> {T getProduct(Class<? extends T> clazz); } public class GenericFactory<T> implements Factory<T> {@Overridepublic T getProduct(Class<? extends T> clazz) {if (clazz == null)return null;try {T obj = (T) clazz.newInstance();return obj;} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return null;} }

三、測試產品的生產

public class MyProgram {public static void main(String[] args) {Factory<Car> carFactory = new GenericFactory<>();Factory<Television> tvFactory = new GenericFactory<>();Car benz = carFactory.getProduct(Benz.class);Car audi = carFactory.getProduct(Audi.class);benz.run();audi.run();Television sonyTV = tvFactory.getProduct(SonyTV.class);Television sharpTV = tvFactory.getProduct(SharpTV.class);sonyTV.play();sharpTV.play();} }

執行結果:

總結

抽象工廠是一種非常有趣的設計模式,它隔離了對象創建的過程,并且可以應用反射機制來完成這一經典的設計模式。但傳統的實現需要具體每一個產品族的工廠,這樣就依然沒有提高通用性。本例中使用泛型的工廠方式,不需要為具體工廠的創建而增加新的編碼。這種方式需要注意泛型的實現,使用<? extends T>可以完美的應對具體產品生產的需要。是一個非常不錯的實現手段。

鳴謝

《Java常用設計模式————抽象工廠模式》

《Java泛型初探————泛型通配》

總結

以上是生活随笔為你收集整理的抽象工厂模式升级版————泛型化实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。