定義
定義一個(gè)用于創(chuàng)建對(duì)象的接口七咧,讓子類決定實(shí)例化哪個(gè)類皱碘。工廠方法使一個(gè)類的實(shí)例化延遲到其子類压昼。
工廠方法與簡(jiǎn)單工廠
對(duì)于簡(jiǎn)單工廠模式送滞,我們知道其在工廠類中包含了必要的邏輯判斷,根據(jù)不同的條件來(lái)動(dòng)態(tài)實(shí)例化相關(guān)類朽褪。對(duì)于客戶端來(lái)說(shuō)置吓,這去除了與具體產(chǎn)品的依賴;但于此同時(shí)也帶來(lái)了一個(gè)問(wèn)題:如果我們要增加產(chǎn)品缔赠,比如我們要生產(chǎn)蘋果計(jì)算機(jī)衍锚,就需要在工廠類中添加一個(gè)
Case
分支條件,這違背了開放封閉原則嗤堰,對(duì)修改也開放了戴质。而工廠方法模式就沒(méi)有違背這個(gè)開放封閉原則。如果我們需要生產(chǎn)蘋果電腦踢匣,則無(wú)需修改工廠類告匠,直接創(chuàng)建產(chǎn)品即可。
角色
- Product:抽象產(chǎn)品類离唬。
-
ConcreteProduct:具體產(chǎn)品類后专,實(shí)現(xiàn)
Product
接口。 -
Factory:抽象工廠類男娄,該方法返回一個(gè)
Product
類型的對(duì)象行贪。 -
ConcreteFactory:具體工廠類,返回
ConcreteProduct
實(shí)例模闲。
工廠方法模式的簡(jiǎn)單實(shí)現(xiàn)
- 首先創(chuàng)建一個(gè)計(jì)算機(jī)的抽象產(chǎn)品類,其中有一個(gè)抽象方法用戶啟動(dòng)計(jì)算機(jī)生產(chǎn):
public abstract class Computer {
/**
* 產(chǎn)品的抽象方法崭捍,由具體的產(chǎn)品類實(shí)現(xiàn)
*/
public abstract void start();
}
- 接著我們創(chuàng)建各個(gè)品牌的計(jì)算機(jī)尸折,其都繼承了自己的父類
Computer
,并實(shí)現(xiàn)了父類的start
方法殷蛇。
public class LenovoComputer extends Computer {
@Override
public void start() {
System.out.println("聯(lián)想計(jì)算機(jī)啟動(dòng)");
}
}
public class HpComputer extends Computer {
@Override
public void start() {
System.out.println("惠普計(jì)算機(jī)啟動(dòng)");
}
}
public class AsusComputer extends Computer {
@Override
public void start() {
System.out.println("華碩計(jì)算機(jī)啟動(dòng)");
}
}
- 創(chuàng)建抽象工廠類实夹,里面有一個(gè)
createComputer
方法,用于生產(chǎn)各種品牌的計(jì)算機(jī)粒梦。
public abstract class ComputerFactory {
public abstract <T extends Computer> T createComputer(Class<T> clz);
}
- 創(chuàng)建具體工廠亮航,廣大代工廠是一個(gè)具體的工廠,其繼承抽象工廠匀们,通過(guò)反射來(lái)生產(chǎn)不同廠家的計(jì)算機(jī)缴淋。
public class GDComputerFactory extends ComputerFactory {
@Override
public <T extends Computer> T createComputer(Class<T> clz) {
Computer computer = null;
String className = clz.getName();
try {
//通過(guò)反射來(lái)生產(chǎn)不同廠家的計(jì)算機(jī)
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)各種計(jì)算機(jī)。
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();
}
}