應用最普遍的模式——工廠方法模式

《Android源碼設計模式解析與實戰》讀書筆記(五) 《Android源碼設計模式解析與實戰》PDF資料下載php

1、工廠方法模式簡介

工廠方法模式,是建立型設計模式之一。數據庫

1.一、定義

定義一個用於建立對象的接口,讓子類決定實例化哪一個類。設計模式

1.二、使用場景

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

2、工廠方法模式的簡單實現

public abstract class AudiFactory {
    public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);
}
複製代碼
public class AudiCarFactory extends AudiFactory {
    @Override
    public <T extends AudiCar> T createAudiCar(Class<T> clz) {
        AudiCar car = null;
        try {
            car = (AudiCar) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T)car;
    }
}
複製代碼
public abstract class AudiCar {
    /**
     * 汽車的抽象產品類
     * <p>
     * 定義汽車的一個行爲方法,車能夠啓動開走
     */
    public abstract void drive();

    /**
     * 定義汽車的一個行爲方法,車能夠自動巡航
     */
    public abstract void selfNavigation();
}
複製代碼
public class AudiQ3 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("Q3啓動了!");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q3開始自動巡航!");
    }
}
複製代碼
public class AudiQ5 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("Q5啓動了!");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q5開始自動巡航!");
    }
}
複製代碼
public class AudiQ7 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("Q7啓動了!");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q7開始自動巡航!");
    }
}
複製代碼
//構造一個製造汽車的工廠對象
AudiFactory factory = new AudiCarFactory();

//生產Q3並啓動
AudiQ3 audiQ3 = factory.createAudiCar(AudiQ3.class);
audiQ3.drive();
audiQ3.selfNavigation();

//生產Q5並啓動
AudiQ5 audiQ5 = factory.createAudiCar(AudiQ5.class);
audiQ5.drive();
audiQ5.selfNavigation();

//生產Q7並啓動
AudiQ7 audiQ7 = factory.createAudiCar(AudiQ7.class);
audiQ7.drive();
audiQ7.selfNavigation();
複製代碼

輸出結果:微信

工廠模式.png

3、工廠方法模式實戰

以數據存儲爲例,代碼以下所示:ide

public abstract class IOHandler {
    /**
     * 添加一條我的信息
     * @param id
     * @param name
     */
    public abstract void add(String id, String name);

    /**
     * 刪除一條我的信息
     * @param id
     */
    public abstract void remove(String id);

    /**
     * 更新一條我的信息
     * @param id
     * @param name
     */
    public abstract void update(String id, String name);

    /**
     * 查詢身份證對應的人名
     * @param id
     * @return
     */
    public abstract String query(String id);
}
複製代碼

對每一種持久化方式都定義一個具體的IO處理類,分別爲普通文件存儲、xml文件存儲和SQLite數據庫存儲。ui

public class FileHandler extends IOHandler {
    @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 "AigeStudio";
    }
}
複製代碼
public class XMLHandler extends IOHandler {
    @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 "SMBrother";
    }
}
複製代碼
public class DBHandler extends IOHandler {
    @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 "Android";
    }
}
複製代碼

定義一個工廠類,以下:spa

public class IOFactory {
    public static <T extends IOHandler> T getIOHandler(Class<T> clz) {
        IOHandler handler = null;
        try {
            handler = (IOHandler) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) handler;
    }
}
複製代碼

4、總結

4.一、優勢

  1. 在工廠方法模式中,工廠方法用來建立客戶所須要的產品,同時還向客戶隱藏了哪一種具體產品類將被實例化這一細節,用戶只須要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名。
  2. 基於工廠角色和產品角色的多態性設計師工廠方法模式的關鍵。它可以使工廠能夠自主肯定建立何種產品對象,而如何建立這個對象的細節則徹底封裝在具體工廠內部。工廠方法模式之因此又被稱爲多態工廠模式,是由於全部的具體工廠類都具備同一抽象父類。
  3. 使用工廠方法模式的另外一個優勢是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,無須修改客戶端,也無需修改其餘的具體工廠和具體產品,而只要添加一個具體工廠和具體產品就能夠了。這樣,系統的可擴展性也變得更好,符合「開閉原則。

4.二、缺點

  1. 在添加新產品時,須要編寫新的具體產品類,並且還要提供與之對應的具體工廠類,系統中類的個數將成對增長,在必定程度上增長了系統的複雜度,有更多的類須要編譯和運行,會給系統帶來一些額外的開銷。
  2. 因爲考慮到系統的可擴展性,須要引入抽象層,在客戶端代碼中均使用抽象層進行定義,增長了系統的抽象性和理解難度,且在實現時可能須要用到DOM、反射等技術,增長了系統的實現難度。

學海無涯苦做舟

個人微信公衆號
相關文章
相關標籤/搜索