1 工廠方法模式介紹
工廠方法模式(Factory Pattern)是創(chuàng)建型設(shè)計模式之一搂根。工廠方法模式是一種結(jié)構(gòu)簡單的模式泼掠,在我們平時的開發(fā)中應(yīng)用很廣發(fā)校镐。其中工廠模式仔細(xì)區(qū)分的話押搪,可以分為三種树酪,分別是簡單工廠模式浅碾、工廠方法模式以及抽象工廠模式。在這里我們學(xué)習(xí)工廠方法模式续语。
2 工廠方法模式定義
定義一個用于創(chuàng)建對象的接口垂谢,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類
工廠方法模式UML類圖:
在工廠方法模式中主要分為四大模塊:
-
Product
:抽象產(chǎn)品類疮茄,是工廠方法模式所創(chuàng)建的產(chǎn)品的父類; -
ConcreteProduct
:具體產(chǎn)品類滥朱,實為實現(xiàn)抽象產(chǎn)品的某個具體產(chǎn)品的對象,現(xiàn)Product
接口; -
Factory
:抽象工廠類力试,為工廠方法模式的核心徙邻,該方法返回一個Product
類型的對象; -
ConcreteFactory
:具體工廠類,其實現(xiàn)了具體的業(yè)務(wù)邏輯畸裳,返回ConcreteFactory
實例鹃栽。
3 工廠方法模式的使用場景
在任何需要生成復(fù)雜對象的地方,都可以使用工廠方法模式躯畴。復(fù)雜對象適合使用工廠模式民鼓,用new
就可以完成創(chuàng)建的對象無需使用工廠模式。
4 工廠方法模式使用示例
具體的工廠模式我們?nèi)缦率纠?/p>
產(chǎn)品抽象類
public abstract class Product {
/**
* 產(chǎn)品類的抽象方法
* 由具體的產(chǎn)品類去實現(xiàn)
*/
public abstract void method();
}
具體的產(chǎn)品類
可以有多個產(chǎn)品類蓬抄,都繼承于抽象產(chǎn)品類丰嘉,實現(xiàn)其抽象方法
public class ConcreteProductA extends Product{
@Override
public void method() {
System.out.println("我是具體的產(chǎn)品A");
}
}
public class ConcreteProductB extends Product{
@Override
public void method() {
System.out.println("我是具體的產(chǎn)品B");
}
}
抽象工廠類
public abstract class Factory {
/**
* 抽象工廠方法
* 具體生產(chǎn)什么由子類去實現(xiàn)
*
* @return 具體產(chǎn)生的對象
*/
public abstract <T extends Product> T createProduct(Class<T> clz);
}
具體工廠類
具體如何生產(chǎn)一個產(chǎn)品的對象,是由具體的工廠類實現(xiàn)的嚷缭。
public class ConcreteFactory extends Factory{
/**
* 抽象工廠方法
* 具體生產(chǎn)什么由子類去實現(xiàn)
* @param clz 產(chǎn)品對象類的類型
* @return 具體的產(chǎn)品對象
*/
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product p = null;
try {
p = (Product)Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) p;
}
}
客戶端類
public class Client {
public static void main(String[] args){
Factory factory = new ConcreteFactory();
Product pA = factory.createProduct(ConcreteProductA.class);
pA.method();
Product pB = factory.createProduct(ConcreteProductB.class);
pB.method();
}
}
//打印的日志:
//我是具體的產(chǎn)品A
//我是具體的產(chǎn)品B
從客戶端類中可以看出饮亏,需要哪一個類的對象就傳入哪一個類的類型即可,這種方法比較簡單阅爽,動態(tài)實現(xiàn)路幸。當(dāng)然也可以為每一個產(chǎn)品都定義一個具體的工廠來實現(xiàn)。具體實現(xiàn)如下:
public class ConcreteFactoryA extends Factory{
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
public class Client {
public static void main(String[] args){
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.method();
}
}
5 總結(jié)
我們可以看到工廠方法模式是完全符合設(shè)計原則的付翁,其降低了對象之間的耦合度简肴,而且工廠方法模式依賴于抽象的架構(gòu),將實例化的任務(wù)交由子類去完場百侧,有非常好的擴(kuò)展性砰识。
優(yōu)點
- 客戶端想要創(chuàng)建一個對象,只要知道其名稱就看了佣渴;
- 擴(kuò)展性高辫狼,在增加產(chǎn)品類的情況下,只要適當(dāng)?shù)匦薷木唧w的工廠類或擴(kuò)展一個工廠類辛润;
- 屏蔽產(chǎn)品的具體實現(xiàn)膨处,客戶端只關(guān)心產(chǎn)品的接口。
缺點
每次增加一個產(chǎn)品時,都需要增加一個具體類和對象實現(xiàn)工廠真椿,使得系統(tǒng)中類的個數(shù)成倍增加秦叛,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時也增加了系統(tǒng)具體類的依賴瀑粥。