1. 程式人生 > >Android的設計模式-簡單工廠模式

Android的設計模式-簡單工廠模式

前言

Android的設計模式系列文章介紹,歡迎關注,持續更新中:

1.定義

定義一個用於建立物件的介面,讓子類決定例項化哪個類。

2.介紹

  • 簡單工廠模式屬於建立型模式。
  • 簡單工廠模式又叫做靜態工廠方法模式。

3.UML類圖

簡單工廠模式UML類圖.png

3.1 角色說明:

  • Product(抽象產品類):要建立的複雜物件,定義物件的公共介面。
  • ConcreteProduct(具體產品類):實現Product介面。
  • Factory(工廠類):返回ConcreteProduct例項。

4.實現

4.1 建立抽象產品類,定義公共介面:

    //抽象產品類 
    public
abstract class Product { public abstract void show(); }

4.2 建立具體產品類,繼承Product類:

    //具體產品類A 
    public class ProductA extends Product {
        @Override
        public void show() {
            System.out.println("product A");
        }
    }
    //具體產品類B
    public class ProductB extends
Product {
@Override public void show() { System.out.println("product B"); } }

4.3 建立工廠類,建立具體的產品:

public class Factory {

    public static Product create(String productName) {
        Product product = null;
        //通過switch語句控制生產哪種商品
        switch (productName) {
            case
"A": product = new ProductA(); break; case "B": product = new ProductB(); break; } return product; } }

4.4 測試方法:

   public void test() {
        Factory.create("A").show();//生產ProductA
        Factory.create("B").show();//生產ProductB
        try {
            Factory.create("C").show();//生產ProductC
        } catch (NullPointerException e) {
            System.out.println("沒有ProductC");//沒有ProductC,會報錯
        }
    }

5.應用場景

  • 生成複雜物件時,確定只有一個工廠類,可以使用簡單工廠模式。否則有多個工廠類的話,使用工廠方法模式

6.優點

  • 程式碼解耦,建立例項的工作與使用例項的工作分開,使用者不必關心類物件如何建立。

7.缺點

  • 違背開放封閉原則,若需新增新產品則必須修改工廠類邏輯,會造成工廠邏輯過於複雜。
  • 簡單工廠模式使用了靜態工廠方法,因此靜態方法不能被繼承和重寫。
  • 工廠類包含了所有例項(產品)的建立邏輯,若工廠類出錯,則會造成整個系統都會會受到影響。

8.工廠方法模式與簡單工廠模式比較

  • 工廠方法模式有抽象工廠類,簡單工廠模式沒有抽象工廠類且其工廠類的工廠方法是靜態的。
  • 工廠方法模式新增產品時只需新建一個工廠類即可,符合開放封閉原則;而簡單工廠模式需要直接修改工廠類,違反了開放封閉原則

9.簡單工廠模式的優化

由於簡單工廠模式新增產品時需要直接修改工廠類,違反了開放封閉原則。因此可以使用反射來建立例項物件,確保能夠遵循開放封閉原則

9.1 反射實現工廠類

public class Factory {

    public static <T extends Product> T create(Class<T> clz) {
        Product product = null;
        try {
            product = (Product) Class.forName(clz.getName()).newInstance();//反射出例項
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) product;
    }
}

9.2 測試方法

    public void test() {
        Factory.create(ProductA.class).show();//生產ProductA
        Factory.create(ProductB.class).show();//生產ProductB
    }

9.3 總結
使用反射來實現工廠類,新增產品時無需修改工廠類,但是使用反射來建立例項物件的話會比正常使用new來建立的要慢。