Android的設計模式-簡單工廠模式
阿新 • • 發佈:2018-12-30
前言
Android的設計模式系列文章介紹,歡迎關注,持續更新中:
1.定義
定義一個用於建立物件的介面,讓子類決定例項化哪個類。
2.介紹
- 簡單工廠模式屬於建立型模式。
- 簡單工廠模式又叫做靜態工廠方法模式。
3.UML類圖
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來建立的要慢。