前言
Android的設計模式系列文章介紹,歡迎關注,持續更新中:
Android的設計模式-設計模式的六大原則
一句話總結23種設計模式則
創建型模式:
Android的設計模式-單例模式
Android的設計模式-建造者模式
Android的設計模式-工廠方法模式
Android的設計模式-簡單工廠模式
Android的設計模式-抽象工廠模式
Android的設計模式-原型模式
行為型模式:
Android的設計模式-策略模式
Android的設計模式-狀態模式
Android的設計模式-責任鏈模式
Android的設計模式-觀察者模式
Android的設計模式-模板方法模式
Android的設計模式-迭代器模式
Android的設計模式-備忘錄模式
Android的設計模式-訪問者模式
Android的設計模式-中介者模式
Android的設計模式-解釋器模式
Android的設計模式-命令模式
結構型模式:
Android的設計模式-代理模式
Android的設計模式-組合模式
Android的設計模式-適配器模式
Android的設計模式-裝飾者模式
Android的設計模式-享元模式
Android的設計模式-外觀模式
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來創建的要慢。
相關文章閱讀
Android的設計模式-設計模式的六大原則
一句話總結23種設計模式則
創建型模式:
Android的設計模式-單例模式
Android的設計模式-建造者模式
Android的設計模式-工廠方法模式
Android的設計模式-簡單工廠模式
Android的設計模式-抽象工廠模式
Android的設計模式-原型模式
行為型模式:
Android的設計模式-策略模式
Android的設計模式-狀態模式
Android的設計模式-責任鏈模式
Android的設計模式-觀察者模式
Android的設計模式-模板方法模式
Android的設計模式-迭代器模式
Android的設計模式-備忘錄模式
Android的設計模式-訪問者模式
Android的設計模式-中介者模式
Android的設計模式-解釋器模式
Android的設計模式-命令模式
結構型模式:
Android的設計模式-代理模式
Android的設計模式-組合模式
Android的設計模式-適配器模式
Android的設計模式-裝飾者模式
Android的設計模式-享元模式
Android的設計模式-外觀模式
Android的設計模式-橋接模式