用一個工廠對象決定建立哪種產品的實例。java
建立型,但不屬於GOF23中設計模式。python
工廠類負責建立的對象比較少,客戶端(應用層)只知道傳入工廠類的參數,對於如何建立對象(邏輯)不關心設計模式
只須要傳入一個正確的參數,就能夠獲取你所須要的對象二無需知道其建立細節。ide
工廠類的職責相對太重,增長新的產品,須要修改工廠類的邏輯判斷(隨着業務不斷增長工廠類的業務邏輯將變難以使人理解),違背開閉原則,沒法造成基於繼承的等級結構。測試
下面看演示代碼spa
假設有個場景咱們有不少視頻須要錄製。咱們定義個抽象類,叫vido同時有個方法produce。設計
public abstract class Video {
public abstract void produce();
}
複製代碼
這個抽象類有一些子類,好比javaVido,PythonVido,code
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("錄製Java課程視頻");
}
}
複製代碼
public class PythonVideo extends Video {
@Override
public void produce() {
System.out.println("錄製Python課程視頻");
}
}
複製代碼
假設咱們要獲取這兩個類的對象,固然咱們能夠new這兩個類來獲取對象,我如今是介紹工程模式,天然要使用工廠模式來建立。咱們如今建立一個工廠類視頻
public class VideoFactory {
public Video getVideo(String type){
if("java".equalsIgnoreCase(type)){
return new JavaVideo();
}else if("python".equalsIgnoreCase(type)){
return new PythonVideo();
}
return null;
}
}
複製代碼
如今寫一個測試類看看這個工廠類怎麼使用。對象
public class FactoryTest {
public static void main(String[] args) {
VideoFactory videoFactory = new VideoFactory();
Video video = videoFactory.getVideo("java");
if(video == null){
return;
}
video.produce();
}
複製代碼
如今來講說這樣寫的缺點:這樣寫咱們每次新增長類都要添加工廠類的代碼,長此以往工廠就會變得很是複雜。下面咱們改進一下工廠。
public class VideoFactory {
public Video getVideo(Class c){
Video video = null;
try {
video = (Video) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return video;
}
}
複製代碼
再看測試類怎麼寫
public class FactoryTest {
VideoFactory videoFactory = new VideoFactory();
Video video = videoFactory.getVideo(JavaVideo.class);
if(video == null){
return;
}
video.produce();
}
}
複製代碼
本文最後咱們說一下改進以後的好處。 咱們class類獲取對象的好處就是不用每次添加對象都去修改工廠類。