定義
定義一個用于創(chuàng)建對象的接口讲仰,讓子類決定實例化哪個類践叠。
使用場景
任何需要生成復雜對象的地方都可以使用工廠方法模式。
UML類圖
關鍵點
(1)整個完整的工廠方法模式包括抽象工廠父類嗡贺、具體工廠子類业舍、抽象產(chǎn)品父類抖拦、具體產(chǎn)品子類。其中抽象工廠是核心舷暮,具體工廠是具體的業(yè)務邏輯态罪,具體產(chǎn)品是具體工廠產(chǎn)生的對象。
(2)如需具體工廠子類可以返回多種具體產(chǎn)品下面,則可以利用反射的原理复颈,通過傳入不同的Class類來決定返回的類型。
(3)可以設置多個具體工廠以分開返回多種產(chǎn)品沥割,此模式稱為多工廠方法模式耗啦。
(4)如果確定工廠只有一個,則可以將抽象工廠類簡化掉机杜,并將對應的工廠方法改為靜態(tài)方法帜讲,此模式稱為簡單工廠模式或者靜態(tài)工廠模式,他是工廠方法模式的一個弱化版本椒拗。
實現(xiàn)方式
抽象產(chǎn)品父類:
public abstract class Product{
? ? public abstract void method();
}
具體產(chǎn)品子類A:
public class ProductA extends Product{
? ? @Override
? ? public void method(){}
}
具體產(chǎn)品子類B:
public class ProductB extends Product{
? ? @Override
? ? public void method(){}
}
抽象工廠父類
public abstract class Factory{
? ? public abstract Product createProduct();
? ? public abstract T createProductByClass(Class clz);
}
具體工廠子類A
public class FactoryA extends Factory{
? ? @Override
? ? public Product createProduct(){
? ? ? ? return new ProductA();
? ? }
? ? @Override
? ? public T createProduct(Class clz){
? ? ? ? return new ProductA();
? ? }
}
可返回多種產(chǎn)品工廠子類:
public class MultiProductFactory extends Factory{
? ? @Override
? ? public Product createProduct(){
? ? ? ? return new ProductA();
? ? }
? ? @Override
? ? public T createProduct(Class clz){
? ? ? ? Product p = null;
? ? ? ? try{
? ? ? ? ? ? p= (Product) Class.forName(clz.getName()).newInstance();
? ? ? ? }catch (Exception e){
? ? ? ? }
? ? ? ? return(T)p;
? ? }
}
靜態(tài)工廠類:
public class staticFactoryB{
? ? public static Product createProduct(){
? ? ? ? return new ProductB();
? ? }
}
工廠方法模式的優(yōu)缺點
優(yōu)點
>降低了各個對象之間的耦合度
>依賴于抽象架構舒帮,有非常好的擴展性
缺點
>每次往工廠方法里添加一種新產(chǎn)品時就需要寫一個新的產(chǎn)品類
>引入了抽象層,導致類結構復雜化
Android中的工廠方法模型舉例
Activity的各個周期方法陡叠,即onCreate()玩郊、onResume()等一系列方法。
——2017.08.02