1. 程式人生 > >java設計模式精講 Debug 方式+記憶體分析 第5章 工廠方法模式

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:
在這裡插入圖片描述
這個是它的是一個實現:
在這裡插入圖片描述

我們要理解
抽象工廠,子類的具體實現的工廠
抽象產品,子類的具體的產品

把抽象方法交給子類來進行實現;