模式定義
工廠方法模式(Factory Method Pattern)又稱為工廠模式拴驮,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式樟插,它屬于類創(chuàng)建型模式怔鳖。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口盒卸,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象骗爆,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類蔽介。
概念有點(diǎn)抽象淮腾,給大家舉個(gè)栗子:
鐵匠制造武器。精靈需要精靈的武器屉佳,獸人需要獸人的武器谷朝。根據(jù)不同的客戶,召喚正確類型的鐵匠武花。
它提供了一種將實(shí)例化邏輯委托給子類的方法圆凰。
模式結(jié)構(gòu)
工廠方法模式包含如下角色:
- Product:抽象產(chǎn)品
- ConcreteProduct:具體產(chǎn)品
- Factory:抽象工廠
- ConcreteFactory:具體工廠
在鐵匠那個(gè)例子中,武器是抽象產(chǎn)品体箕,精靈的武器和獸人的武器是具體產(chǎn)品专钉;鐵匠是抽象工廠挑童,能夠打造具體武器的鐵匠是具體工廠。
程序?qū)嵗?/h2>
以鐵匠為例跃须。首先站叼,我們有一個(gè)blacksmith接口和它的一些實(shí)現(xiàn)
public interface Blacksmith {
Weapon manufactureWeapon(WeaponType weaponType);
}
public class ElfBlacksmith implements Blacksmith {
public Weapon manufactureWeapon(WeaponType weaponType) {
return new ElfWeapon(weaponType);
}
}
public class OrcBlacksmith implements Blacksmith {
public Weapon manufactureWeapon(WeaponType weaponType) {
return new OrcWeapon(weaponType);
}
}
現(xiàn)在,隨著客戶的到來菇民,正確類型的鐵匠被召集起來尽楔,要求制造武器
Blacksmith blacksmith = new ElfBlacksmith();
blacksmith.manufactureWeapon(WeaponType.SPEAR);
blacksmith.manufactureWeapon(WeaponType.AXE);
// Elvish weapons are created
適用環(huán)境
適合工廠方法模式的情形:
- 一個(gè)類不知道它所需要的對(duì)象的類:在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類的類名第练,只需要知道所對(duì)應(yīng)的工廠即可阔馋,具體的產(chǎn)品對(duì)象由具體工廠類創(chuàng)建;客戶端需要知道創(chuàng)建具體產(chǎn)品的工廠類娇掏。
- 一個(gè)類通過其子類來指定創(chuàng)建哪個(gè)對(duì)象:在工廠方法模式中呕寝,對(duì)于抽象工廠類只需要提供一個(gè)創(chuàng)建產(chǎn)品的接口,而由其子類來確定具體要?jiǎng)?chuàng)建的對(duì)象婴梧,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則下梢,在程序運(yùn)行時(shí),子類對(duì)象將覆蓋父類對(duì)象塞蹭,從而使得系統(tǒng)更容易擴(kuò)展怔球。
- 將創(chuàng)建對(duì)象的任務(wù)委托給多個(gè)工廠子類中的某一個(gè),客戶端在使用時(shí)可以無須關(guān)心是哪一個(gè)工廠子類創(chuàng)建產(chǎn)品子類浮还,需要時(shí)再動(dòng)態(tài)指定竟坛,可將具體工廠類的類名存儲(chǔ)在配置文件或數(shù)據(jù)庫中。
參考: