国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程設計模式之工廠方法模式實例詳解

2019-10-22 18:18:59
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程設計模式之工廠方法模式。分享給大家供大家參考,具體如下:

一、介紹

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

二、定義

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

三、使用場景

在任何需要生成復雜對象的地方,都可以使用工廠方法模式。復雜對象適合使用工廠模式,用new就可以完成創建的對象無需使用工廠模式。

四、模式的簡單實現

抽象產品類:

public abstract class Product {  /**   * 產品類的抽象方法   * 由具體的產品類去實現   * */  public abstract void method();}

具體產品類A:

public class ConcreteProductA extends Product {  @Override  public void method() {    System.out.println("我是具體的產品A");  }}

具體產品類B:

public class ConcreteProductB extends Product {  @Override  public void method() {    System.out.println("我是具體的產品B");  }}

抽象工廠類:

public abstract class Factory {  /**   * 抽象工廠方法   * 具體由子類實現   *    * @return 具體的產品對象   * */  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();  }}

結果:

我是具體的產品A

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

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

public class ConcreteFactory extends Factory {  /**   * 具體工廠類   * */  @Override  public Product createProduct() {    //return new ConcreteProductA();    return new ConcreteProductB();  }}

這種方式比較常見,需要哪一個產品就生產哪一個,有時候也可以利用反射的方式更簡潔的來生產具體產品對象,此時,需要在工廠方法的參數列表中傳入一個Class類來決定是哪一個產品類:

public abstract class Factory {  /**   * 抽象工廠方法   * 具體由子類實現   *    * @param clz 產品對象類類型   *    * @return 具體的產品對象   * */  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中的實現:

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

需要哪一個類的對象就傳入哪一個類的類型即可,這種方法比較簡潔、動態,如果你不喜歡這種方式,也可以嘗試為每一個產品都定義一個具體的工廠,各司其職。

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();  }}

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

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

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

其實到這里大家應該可以發現,工廠方法模式是完全符合設計原則的,其降低了對象之間的耦合度,而且,工廠方法模式依賴于抽象的架構,其將實例化的任務交由子類去完成,有非常好的擴展性。

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

Activity的各種生命周期

ArrayList和HashSet

六、總結

優點:

工廠方法模式完全符合設計原則,降低了對象之間的耦合。高層模塊只需要知道產品的抽象類,其他的實現都不需要關心。

良好的封裝性,代碼結構清晰。擴展性好。

缺點:

每次我們為工廠方法模式添加新的產品時就要編寫一個新的產品類。同時還要引入抽象層,這必然會導致類結構的復雜化,所以,在某些情況比較簡單時,是否要使用工廠模式,需要設計者權衡利弊了。

希望本文所述對大家Android程序設計有所幫助。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 曲阜市| 淮阳县| 大同县| 根河市| 丹寨县| 庆安县| 仙游县| 英德市| 永州市| 盱眙县| 明星| 康乐县| 安化县| 平谷区| 荥阳市| 霍城县| 庐江县| 文水县| 西平县| 桐柏县| 湄潭县| 屏东县| 嘉兴市| 福州市| 天津市| 博白县| 巩义市| 多伦县| 荆州市| 宜兰市| 麻栗坡县| 翁源县| 河东区| 禹州市| 博湖县| 鸡东县| 衡水市| 左权县| 金山区| 望都县| 云龙县|