Android中的設計模式之工廠方法模式

參考

  • 《設計模式:可複用面向對象軟件的基礎 》3.3 Factory method 對象建立型模式
  • 《Android源碼設計模式解析與實戰》第5章 應用最普遍的模式--工廠方法模式

意圖

定義一個用於建立對象的接口,讓子類決定實例化哪個類。Factory Method使一個類的實例化延遲到其子類java

別名

虛構造器設計模式

適用性

  • 當一個類不知道它所必須建立的對象的類的時候
  • 當一個類但願由它的子類來指定它所建立的對象的時候
  • 當類將建立對象的職責委託給多個幫助子類中的某一個,而且你但願將哪個幫助子類是代理者這一信息局部化的時候。

結構

結構

角色

  • Product 定義工廠方法所建立的對象的接口
  • ConcreteProduct 實現Product接口
  • Factory 聲明工廠方法,該方法返回一個Product類型的對象,也能夠定義一個默認實現,返回一個默認的ConcreteProduct對象
  • ConcreteFactory 重定義工廠方法以返回一個ConcreteProduct對象

協做

Factory依賴於它的子類來實現工廠方法,因此它返回一個合適的ConcreteProduct實例。ide

簡單代碼實現

/**
 *  產品抽象類
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/13  23:27
 */
public abstract class Product {
    /**
     * 產品類的抽象方法,具體由子類去實現
     */
    public abstract void method();
}

/**
 *  具體的產品類A
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/13  23:30
 */
public class ProductA extends Product {
    @Override
    public void method() {
        System.out.println("我是具體的產品A");
    }
}

/**
 *  具體的產品類B
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/13  23:30
 */
public class ProductB extends Product {
    @Override
    public void method() {
        System.out.println("我是具體的產品B");
    }
}

/**
 *  抽象工廠方法,具體生產什麼由子類去實現
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/13  23:32
 */
public  abstract class Factory {
    /**
     * 生產具體的產品對象
     * @return
     */
    public abstract Product createProduct();
}

/**
 *  具體工廠類
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/13  23:34
 */
public class ConcreteFactory extends Factory {
    @Override
    public Product createProduct() {
    // 好比這裏是建立一個產品A
        return new ProductA();
    }
}
// 使用工廠方法的獲得實例
public static void main(String[] args){
        Factory factory = new ConcreteFactory();
        Product product = factory.createProduct();
        product.method();
    }

執行結果:工具

我是具體的產品A

若是想要使用產品B,簡單的方法是新建個ProductFactoryB類測試

/**
 *  具體工廠類
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/13  23:34
 */
public class ProductBFactory extends Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

客戶端使用ProductBFactory便可spa

改進

每一個具體的Product都對應一個Factory類未免使得類文件太多了,能夠試試Java的反射,把具體的對象的建立都放在一個createProduct方法中。設計

例子:代理

/**
 *  抽象工廠方法,具體生產什麼由子類去實現
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/13  23:32
 */
public  abstract class Factory {
    /**
     * 生產具體的產品對象
     * @param clz 具體產品的類名
     * @param <T>
     * @return 具體產品實例
     */
    public  abstract <T extends Product> T createProduct(Class<T> clz);
}


/**
 *  具體工廠類
 * @author newtrekWang
 * @email  wangjiaxing20160101@gmail.com
 * @time   2018/8/13  23:34
 */
public class ConcreteFactory extends Factory {

    @Override
    public <T extends Product> T createProduct(Class<T> clz) {
        Product product = null;
        try {
            product = (Product) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T)product;
    }
}
// 測試
 public static void main(String[] args){
        Factory factory = new ConcreteFactory();
        ProductA productA = factory.createProduct(ProductA.class);
        productA.method();
        ProductB productB = factory.createProduct(ProductB.class);
        productB.method();
    }

執行結果:code

我是具體的產品A
我是具體的產品B

簡化

若是具體工廠類只有一個,能夠簡化掉抽象工廠類,否則就是多工廠方法模式。對象

應用例子1 List和Set中的iterator()方法

應用例子2 Android 組件中的onCreate,onCreateView這種方法

應用例子3 序列化工具 IOHandler

Android中數據持久化由多種方式,不外乎都是增刪改查,咱們能夠將每一種數據操做的方式做爲一個產品類,在抽象產品類中定義操做的方法。

結構圖

結構圖

相關文章
相關標籤/搜索