java設計模式精講 Debug 方式+記憶體分析 第5章 工廠方法模式
工廠方法模式
5-1 工廠方法講解
5-2 工廠方法coding
業務場景和之前的簡單工廠一樣,我們直接對簡單工廠裡面的程式碼進行改造:
還是一樣一個Video類
public abstract class Video {
public abstract void product();
}
Video類有兩個子類:
public class JavaVideo extends Video {
@Override
public void product() {
System.out.println("錄製Java課程視訊");
}
}
public class PythonVideo extends Video {
@Override
public void product() {
System.out.println("錄製Python的課程視訊");
}
}
把之前的工廠類改成一個抽象類,裡面只留一個待實現的抽象方法:
public abstract class VideoFactory {
public abstract Video getVideo();
}
Java視訊和Pytho視訊都是同一個產品等級,都是視訊’這裡要理解一個概念:相同型別的一個產品,我們稱之為產品等級,他們的等級都是在視訊的這個等級上;
產品等級和產品族是區分工廠方法和抽象方法的重要概念;
建立一個建立JavaVideoFactory的工廠類,繼承於VideoFactory這個抽象類:
public class JavaVideoFactory extends VideoFactory {
@Override
public Video getVideo () {
return new JavaVideo();
}
}
同理,我們再建立一個PythonVideoFactory的工廠類:
public class PythonVideoFactory extends VideoFactory {
@Override
public Video getVideo() {
return new PythonVideo();
}
}
VideoFactory只定義一個預設的契約,具體建立哪一種物件由具體的子類工廠去實現:
測試如下:
public class Test {
public static void main(String[]args){
VideoFactory videoFactory = new JavaVideoFactory();
Video video = videoFactory.getVideo();
video.product();
}
}
測試結果:
錄製Java課程視訊
如果我們想要創建出PythonVideo的例項,那麼我們就只需要把VideoFactory的例項指向PythonVideoFactory工廠就可以了:
public class Test {
public static void main(String[]args){
VideoFactory videoFactory = new PythonVideoFactory();
Video video = videoFactory.getVideo();
video.product();
}
}
執行結果:
錄製Python的課程視訊
如何還有一個前端視訊,我們就可以這樣來做:
建立FEVideo:
public class FEVideo extends Video {
@Override
public void product() {
System.out.println("錄製前端課程視訊");
}
}
建立一個建立FEVideo物件的工廠:
public class FEVideoFactory extends VideoFactory {
@Override
public Video getVideo() {
return new FEVideo();
}
}
現在的類圖:
這裡引出產品組的概念:
例如說,幕課的視訊就是教程,但是後續網站規定你有了視訊之後,還要有對應的手記,這兩個打包在一起,在可以稱之為教程,那對於Python,Java或者是FE來說:Java的視訊,Java的手記,他們都屬於Java,他們屬於同一產品族,而Java的視訊,Python的視訊,FE的視訊來說,他們屬於同一產品等級;
這個概念有點拗口,抽象工廠就是解決產品族的問題;
5-3 工廠方法原始碼解析(jdk+logback)
如ArrayList裡面的iterator方法
又如:
URLStreamHandlerFactory:
這個是它的是一個實現:
我們要理解
抽象工廠,子類的具體實現的工廠
抽象產品,子類的具體的產品
把抽象方法交給子類來進行實現;