1. 程式人生 > >設計模式之Factory(工廠設計模式)

設計模式之Factory(工廠設計模式)

  • 工廠模式是我們很常用的模式了,著名的spring框架就使用了工廠模式。

  • 為什麼說工廠模式是最常用的,因為工廠模式就相當於建立物件的new。工廠模式就是用來建立物件的

  • 在PatternsInJava
    書中把工廠模式主要分為:工廠方法與抽象工廠,當然這本書在舉例的時候用比較簡單的例項,讓你來明白工廠模式具體來做什麼,但是在實際應用中往往要複雜的多,比如spring框架在運用工廠模式的時候,但歸根結底工廠模式主要是用來給我們的程式進行解耦,替我們去建立我們所需的物件。

工廠方法

  • 工廠方法一般用於簡單的物件建立,下面簡單的舉一個工廠方法的程式碼例項

    所需的類

package com.dongzhu.cn.factory;

import com.dongzhu.cn.bean.HisSample;
import com.dongzhu.cn.bean.MySample;
import com.dongzhu.cn.port.Sample;
// 工廠方法類
public class Factory {

    public static Sample creator(int which){

        // ....
        if(which == 1){
            return new MySample();
        }else if(which == 2) {
            return new HisSample();
        }
        return null;
    }
}
// 主啟動類
public class MainClass {

    public static void main(String[] args) {
        Sample sample = Factory.creator(1);
    }
}

其實在我們看來這樣子做,基本上沒什麼用因為它還是強耦合的,但是卻直觀的幫我們重現工廠所幫
我們做的是,那就是建立物件,並且封裝了建立例項的程式碼,以上是工廠方法的舉例。

抽象工廠

  • 當我們所建立的物件種類越來越多,越來越複雜我們就得考慮去用抽象工廠,而非方法工廠,兩個模式並沒有很大的區別,區別就是建立物件的複雜度。
  • 例:

抽象工廠

public abstract class AbstractClass {

    public abstract Sample creator();

    public abstract Sample2 Creator2();
}

抽象工廠具體實現

工廠具體實現
public  class  Factory extends AbstractClass {


    @Override
    public Sample creator() {
        return null;
    }

    @Override
    public Sample2 Creator2() {
        return null;
    }
}
  • 以上就是抽象工廠與方法工廠的兩個例子,看到目前我相信對工廠模式也有一個大概的認識了,但到目前為止兩個例子貌似並沒有什麼實際的作用,這也可以理解畢竟目前是讓你建立起工廠的概念,那麼接下來就簡單的寫一個工廠在實際的運用中的例子

實際運用

  • 檔案結構
    在這裡插入圖片描述
  • 工廠類
public class Factory {

    private static HashMap<String, Object> cacheMap = new HashMap();

    static {
        try {
            Properties properties = new Properties();
            InputStream inputStream = new FileInputStream("resource/application.properties");
            properties.load(inputStream);
            Enumeration<?> enumeration = properties.propertyNames();
            while (enumeration.hasMoreElements()) {
                String className = (String) enumeration.nextElement();
                String classPath = properties.getProperty(className);
                Class<?> temp = Class.forName(classPath);
                Object object = temp.newInstance();
                cacheMap.put(className, object);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static <T> T getInstance(String name) {
        return (T)cacheMap.get(name);
    }
}
  • 主啟動類
public class MainClass {

    public static void main(String[] args) {
        HisSample hisSample = Factory.<HisSample>getInstance("hisSample");
        System.out.println(hisSample);
    }
}
  • 以上就是基本的工廠在實際當中運用,這樣就能大大減少程式的耦合,利用反射建立我們所需的類,就算我們刪除了某些類也不會出現報錯,只需要改動properties檔案內容即可,是不是很方便,spring框架也是相同的思想,但是同時也要說一句spring框架內部實現比我所寫的小例子要大的多的多,要考慮的問題也要多的多的多。

宣告:本章參考了patternInJava 書籍