設計模式之工廠模式(1)簡單工廠

簡單工廠

定義

用一個工廠對象決定建立哪種產品的實例。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類獲取對象的好處就是不用每次添加對象都去修改工廠類。

相關文章
相關標籤/搜索