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

在平常開發過程當中時常須要用到設計模式,可是設計模式有23種,如何將這些設計模式瞭然於胸而且能在實際開發過程當中應用得駕輕就熟呢?和我一塊兒跟着《Android源碼設計模式解析與實戰》一書邊學邊應用吧!

設計模式系列文章

今天咱們要講的是工廠方法模式


定義

定義一個用於建立對象的接口,讓子類決定實例化哪一個類git

使用場景

  • 在任何須要生成複雜對象的地方,均可以使用工廠方法模式。複雜對象適合使用工廠模式,用new就能夠完成建立的對象無需使用工廠模式

使用例子

  • Activity中的各個生命週期方法就能夠看做是工廠方法

實現

通常分4大模塊

  • 抽象產品
  • 具體產品
  • 抽象工廠
  • 具體的工廠

實現的要點

  • 工廠方法模式實現比較簡單,方式也比較靈活,並不必定侷限於上述的四個模塊,能夠根據須要來修改。好比只有一個工廠時能夠省略抽象工廠

實現方式

工廠方法模式的實現主要是根據具體的實際狀況來將多個產品的共性抽象出來,並定製具體的產品類,而後用工廠類來根據須要生產具體的產品類。下面經過一個簡單的例子來看看工廠方法的實現

  • 抽象產品類
public abstract class Product {

    /**
     * 產品類的抽象方法,由具體的產品類去實現
     */
    public abstract void method();
}
複製代碼
  • 具體產品類
//產品A
public class ProductA extends Product {

    @Override
    public void method() {
        System.out.println("產品A");
    }
}

//產品B
public class ProductB extends Product {

    @Override
    public void method() {
        System.out.println("產品B");
    }
}

複製代碼
  • 抽象工廠
public abstract class Factory {

    /**
     * @param clz 產品對象類型
     * @return 具體的產品類型
     */
    public abstract <T extends Product> T createProduct(Class<T> clz);
}
複製代碼
  • 具體工廠
public class ConcreteFactory extends Factory {

    @Override
    public <T extends Product> T createProduct(Class<T> clz) {
        Product p = null;
        try {
            p = (Product) Class.forName(clz.getName()).newInstance();

        }catch (Exception e) {
            e.printStackTrace();
        }

        return (T) p;
    }
}
複製代碼
  • 調用
Factory factory = new ConcreteFactory();
Product productA = factory.createProduct(ProductA.class);
Product productB = factory.createProduct(ProductB.class);
productA.method();
productB.method();
複製代碼
  • 上面的例子中,咱們的工廠方法採用了反射的方式來實現生產具體的產品對象,這樣更加簡潔,不用爲每個產品都建立一個具體的工廠。

上面的例子比較簡單,下面咱們看看書中做者的舉例,利用工廠方法模式封裝數據持久化過程

  • Android 中數據持久化爲咱們提供了SharePreference和SQLite,還有普通的文件存儲等方式。可是對數據的操做都是增刪改查,能夠把這些共同的操做抽象出來做爲抽象產品類,而後每一種持久化方法做爲具體產品。
  • 抽象產品中定義操做的方法,即增刪改查
public abstract class AbstractIoHandler {

    /**
     * 添加我的信息
     *
     * @param id 身份證號碼
     * @param name 姓名
     */
    public abstract void add(String id, String name);

    /**
     * 根據ID刪除一條信息
     *
     * @param id 身份證
     */
    public abstract void remove(String id);

    /**
     * 更新我的信息
     *
     * @param id 身份證
     * @param name 姓名
     */
    public abstract void update(String id, String name);

    /**
     * 查詢ID對應的信息
     *
     * @param id 身份證
     * @return 人名
     */
    public abstract String query(String id);

}
複製代碼
  • 具體的產品,持久化的類型,好比利用文件來持久化
public class FileHandler extends AbstractIoHandler {

    @Override
    public void add(String id, String name){
        //業務處理
    }

    @Override
    public void remove(String id) {
        //業務處理
    }

    @Override
    public void update(String id, String name) {
        //業務處理
    }

    @Override
    public String query(String id) {
        return "";
    }
}
複製代碼
  • 而後是咱們的工廠方法,這裏仍然採用反射的方式
public class IoFactory {

    /**
     * 獲取IoHandler
     *
     * @param clz AbstractIoHandler類型的類
     * @return AbstractIoHandler對象
     */
    public static <T extends AbstractIoHandler> T getIoHandler(Class<T> clz) {
        AbstractIoHandler handler = null;
        try {
            handler = (AbstractIoHandler) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return (T) handler;
    }
}
複製代碼
  • 在須要進行數據持久化的地方調用工廠方法
AbstractIoHandler ioHandler = IoFactory.getIoHandler(FileHandler.class);
System.out.println(ioHandler.query("123456"));
複製代碼
  • 這裏的例子簡化了不少,還有數據庫SQLite以及SharePreference的持久化的類就沒有寫了。

總結

  • 工廠方法模式經過依賴抽象來達到解耦的效果,而且將實例化的任務交給子類去完成,有很是好的擴展性
  • 工廠方法模式用於生成比較複雜的對象。像咱們上面的例子中同樣,當咱們有多個產品須要,咱們能夠把產品共性的地方抽象出來,而後利用工廠方法生產具體須要的產品
  • 工廠方法模式的應用很是普遍,然而缺點也很明顯,就是每次咱們爲工廠方法添加新的產品時,都須要編寫一個新的產品類,因此要根據實際狀況來權衡是否要用工廠方法模式

源碼地址:https://github.com/snowdream1314/DesignPatternsExamplesgithub


歡迎關注個人微信公衆號,期待與你一塊兒學習,一塊兒交流,一塊兒成長! 數據庫

AntDream
相關文章
相關標籤/搜索