定義
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類。
工廠方法與簡單工廠
對于簡單工廠模式,我們知道其在工廠類中包含了必要的邏輯判斷,根據(jù)不同的條件來動態(tài)實例化相關(guān)類。對于客戶端來說,這去除了與具體產(chǎn)品的依賴;但于此同時也帶來了一個問題:如果我們要增加產(chǎn)品,比如我們要生產(chǎn)蘋果計算機,就需要在工廠類中添加一個
Case
分支條件,這違背了開放封閉原則,對修改也開放了。而工廠方法模式就沒有違背這個開放封閉原則。如果我們需要生產(chǎn)蘋果電腦,則無需修改工廠類,直接創(chuàng)建產(chǎn)品即可。
角色
- Product:抽象產(chǎn)品類。
-
ConcreteProduct:具體產(chǎn)品類,實現(xiàn)
Product
接口。 -
Factory:抽象工廠類,該方法返回一個
Product
類型的對象。 -
ConcreteFactory:具體工廠類,返回
ConcreteProduct
實例。
工廠方法模式的簡單實現(xiàn)
- 首先創(chuàng)建一個計算機的抽象產(chǎn)品類,其中有一個抽象方法用戶啟動計算機生產(chǎn):
public abstract class Computer {
/**
* 產(chǎn)品的抽象方法,由具體的產(chǎn)品類實現(xiàn)
*/
public abstract void start();
}
- 接著我們創(chuàng)建各個品牌的計算機,其都繼承了自己的父類
Computer
,并實現(xiàn)了父類的start
方法。
public class LenovoComputer extends Computer {
@Override
public void start() {
System.out.println("聯(lián)想計算機啟動");
}
}
public class HpComputer extends Computer {
@Override
public void start() {
System.out.println("惠普計算機啟動");
}
}
public class AsusComputer extends Computer {
@Override
public void start() {
System.out.println("華碩計算機啟動");
}
}
- 創(chuàng)建抽象工廠類,里面有一個
createComputer
方法,用于生產(chǎn)各種品牌的計算機。
public abstract class ComputerFactory {
public abstract <T extends Computer> T createComputer(Class<T> clz);
}
- 創(chuàng)建具體工廠,廣大代工廠是一個具體的工廠,其繼承抽象工廠,通過反射來生產(chǎn)不同廠家的計算機。
public class GDComputerFactory extends ComputerFactory {
@Override
public <T extends Computer> T createComputer(Class<T> clz) {
Computer computer = null;
String className = clz.getName();
try {
//通過反射來生產(chǎn)不同廠家的計算機
computer = (Computer)Class.forName(className).newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return (T) computer;
}
}
- 客戶端調(diào)用,客戶端創(chuàng)建
GDComputerFactory
生產(chǎn)各種計算機。
public class Client {
public static void main(String[] args) {
ComputerFactory computerFactory = new GDComputerFactory();
LenovoComputer mLenovoComputer = computerFactory.createComputer(LenovoComputer.class);
mLenovoComputer.start();
HpComputer mHpComputer = computerFactory.createComputer(HpComputer.class);
mHpComputer.start();
AsusComputer mAsusComputer = computerFactory.createComputer(AsusComputer.class);
mAsusComputer.start();
}
}