一授翻、概述
??工廠方法(Factory Method)又叫虛擬構(gòu)造(Virtual Constructor)或者多態(tài)工廠(Polymorphic Factory)十电。核心概念在于定義一個(gè)創(chuàng)建對象的接口和一個(gè)抽象對象基類,但由其子類決定要實(shí)例化的類是哪一個(gè)宝鼓,工廠方法讓類把實(shí)例化推遲到子類。
??工廠方法的結(jié)構(gòu)是由四個(gè)角色組成:抽象工廠、具體工廠漆际、抽象產(chǎn)品、具體產(chǎn)品夺饲。抽象工廠是工廠方法模式的核心奸汇,在模式中任何創(chuàng)建對象的工廠類都必須實(shí)現(xiàn)抽象工廠接口;具體工廠即實(shí)現(xiàn)了抽象工廠接口的具體工廠類往声;抽象產(chǎn)品是所創(chuàng)建的產(chǎn)品對象的超類型擂找,即具體產(chǎn)品對象的共同父類或共同實(shí)現(xiàn)的接口;具體產(chǎn)品是指實(shí)現(xiàn)了抽象產(chǎn)品接口或繼承抽象產(chǎn)品類的產(chǎn)品類浩销。
二贯涎、示例
??現(xiàn)在假設(shè),蛋糕店有兩個(gè)糕點(diǎn)師Jerry和Tom慢洋,Jerry的拿手糕點(diǎn)是草莓蛋糕塘雳,而Tom卻擅長做巧克力蛋糕。且警。那現(xiàn)在我們就可以利用工廠方法模式讓糕點(diǎn)師們?yōu)槲覀冏鏊麄兡檬值牡案夥勰恚a如下:
- 定義抽象蛋糕師接口:
public interface CakeMaker{
Cake makeCake();
}
- 定義抽象蛋糕接口:
public interface Cake{
String display();
}
- 請兩個(gè)糕點(diǎn)師登場
class Jerry implements CakeMaker{
@Override
public Cake makeCake(){
return new StrawberryCake();
}
}
class Tom implements CakeMaker{
@Override
public Cake makeCake(){
return new ChocolateCake();
}
}
- 最后是兩個(gè)類型的蛋糕
class StrawberryCake implements Cake{
@Override
public String display(){
return "This is a strawberry cake!";
}
}
class ChocolateCake implements Cake{
@Override
public String display(){
return "This is a chocolate cake";
}
}
- 現(xiàn)在可以讓他們開始做了
public class Test{
public static void main(String[] args){
// 來一個(gè)草莓蛋糕
CakeMaker Jerry = new Jerry();
Cake strawberryCake = Jerry.makeCake();
System.out.println(strawberryCake.display());
// 再來一個(gè)巧克力草莓
CakeMaker Tom = new Tom();
Cake chocolateCake = Tom.makeCake();
System.out.println(chocolateCake.display());
}
}
三、總結(jié)
- 工廠方法的核心在于把工廠和產(chǎn)品進(jìn)行抽象斑芜,把具體的實(shí)例化邏輯交由實(shí)現(xiàn)類肩刃,即將任務(wù)延遲到子類中去完成;
- 添加新的功能模塊杏头,無須修改接口盈包,滿足開閉原則;
- 阻斷了調(diào)用方與具體實(shí)現(xiàn)邏輯的依賴關(guān)系醇王,提高了系統(tǒng)的可擴(kuò)展性呢燥,符合迪米特原則。