1.因?yàn)楹?jiǎn)單工廠模式設(shè)計(jì)增加功能時(shí)要修改工廠類,這不符合開閉原則所以要進(jìn)行改進(jìn)成為工廠方法模式
2.工廠方法模式的定義:
(1):定義一個(gè)用于創(chuàng)建對(duì)象的接口,但是讓子類決定將哪一個(gè)類實(shí)例化.工廠方法模式讓一個(gè)類的實(shí)例化延遲到其子類.
(2)工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象.目的是將產(chǎn)品的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體的產(chǎn)品類.
3.這里給出一工廠方法模式的UML類圖
4.分析工廠方法模式的結(jié)構(gòu)
工廠方法模式包含以下4個(gè)角色:
(1)Product(抽象產(chǎn)品)
(2)ConcreteProduct(具體產(chǎn)品)
(3)Factory(抽象工廠)
(4)ConcreteFactory(具體工廠)
5.工廠方法模式代碼實(shí)現(xiàn)
public interface Factory {
public Product factoryMethod();
}
public class ConcreteFactory implements Factory {
public Product factoryMethod() {
return new ConcreteProduct();
}
}
public class Client {
public static void main(String[] args) {
Factory factory;
//可通過配置文件和反射機(jī)制實(shí)現(xiàn)(我這里用的xml)
factory = new ConcreteFactory();
//這個(gè)抽象類我這里就沒有附加代碼,這個(gè)到這里應(yīng)該看的懂
Product product;
//多態(tài)
product = factory.factoryMethod();
}
}
6.這里還有一個(gè)有意思的實(shí)例大家可以看一看
(1)題目:
某系統(tǒng)運(yùn)行日志記錄器(Logger)可以通過多種途徑保存系統(tǒng)的運(yùn)行日志,例如通過文件記錄或數(shù)據(jù)庫記錄施无,用戶可以通過修改配置文件靈活地更換日志記錄方式。在設(shè)計(jì)各類日志記錄器時(shí),開發(fā)人員發(fā)現(xiàn)需要對(duì)日志記錄器進(jìn)行一些初始化工作,初始化參數(shù)的設(shè)置過程較為復(fù)雜嘁灯,而且某些參數(shù)的設(shè)置有嚴(yán)格的先后次序猬仁,否則可能會(huì)發(fā)生記錄失敗。
為了更好地封裝記錄器的初始化過程并保證多種記錄器切換的靈活性滥壕,現(xiàn)使用工廠方法模式設(shè)計(jì)該系統(tǒng)。
(2)給UML類圖代碼就不提供了(可以模仿上面的代碼來寫)
7.工廠方法模式的優(yōu)缺點(diǎn)
(1)優(yōu)點(diǎn):
1.工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié)
2.能夠讓工廠自主確定 創(chuàng)建何種產(chǎn)品對(duì)象,而如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部
3.在系統(tǒng)中加入新產(chǎn)品時(shí),完全符合開閉原則
(2)缺點(diǎn):
1.系統(tǒng)中類的個(gè)數(shù)將成對(duì)增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,會(huì)給系統(tǒng)帶來一些額外的開銷
2.增加了系統(tǒng)的抽象性和理解難度