簡單工廠模式(Factory Pattern)

簡單工廠模式又 叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。 
我們從一個例子展開,現在有一道面試題:使用java實現一個計算機控制檯程序,要求輸入數的運算,得到結果。 
這道題目最原始的寫法:

public class Client {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("請輸入第一個數字:");
        float num1  = in.nextFloat();
        System.out.println("請輸入第二個數字:");
        float num2  = in.nextFloat();
        System.out.println("請輸入運算符號:");
        String mark = in.next();
        if("+".equals(mark)){
            System.out.println("result : "+(num1+num2));
        }else if("-".equals(mark)){
            System.out.println("result : "+(num1-num2));
        }else if("*".equals(mark)){
            System.out.println("result : "+(num1*num2));
        }else if("/".equals(mark)){
            System.out.println("result : "+(num1/num2));
        }
    }
}

上面的寫法實現雖然簡單,但是卻沒有面向對象的特性,代碼拓展性差,顯然不是出題者想要考察的意圖。 
那麼面向對象編程要如何在題中體現呢? 
請看下面這段代碼:



abstract class Operation {
	public abstract float getResult(float num1, float num2);
}

//加法運算
class Addition extends Operation {

	@Override
	public float getResult(float num1, float num2) {
		return num1 + num2;
	}
}

class Subtraction extends Operation {

	@Override
	public float getResult(float num1, float num2) {
		return num1 - num2;
	}
}

class Multiplication extends Operation {

	@Override
	public float getResult(float num1, float num2) {
		return num1 * num2;
	}

}

class Division extends Operation {

	@Override
	public float getResult(float num1, float num2) {
		return num1 / num2;
	}

}

class SimpleFactory {
	public static Operation getOperation(String mark) {
		Operation o = null;
		switch (mark) {
		case "+":
			o = new Addition();
			break;
		case "-":
			o = new Subtraction();
			break;
		case "*":
			o = new Multiplication();
			break;
		case "/":
			o = new Division();
			break;
		default:
			break;
		}
		return o;
	}
}

public class Client {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
        System.out.println("請輸入第一個數字:");
        float num1  = in.nextFloat();
        System.out.println("請輸入第二個數字:");
        float num2  = in.nextFloat();
        System.out.println("請輸入運算符號:");
        String mark = in.next();
        System.out.println("result:"+count(num1,num2,mark));
	}
	public static float count(float num1,float num2,String mark) {
		Operation o = SimpleFactory.getOperation(mark);
		return o.getResult(num1, num2);
	}
}

簡單工廠將對象的創建過程進行了封裝,用戶不需要知道具體的創建過程,只需要調用工廠類獲取對象即可。這種簡單工廠的寫法是通過switch-case來判斷對象創建過程的。在實際使用過程中,違背了 開放-關閉原則,當然有些情況下可以通過反射調用來彌補這種不足。那麼我們現在再來看看簡單工廠模式。

簡單工廠模式

這個模式本身很簡單而且使用在業務較簡單的情況下。一般用於小項目或者具體產品很少擴展的情況(這樣工廠類纔不用經常更改)。
它由三種角色組成:
工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯,根據邏輯不同,產生具體的工廠產品。如例子中SimpleFactory的類。
抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。由接口或者抽象類來實現。如例中的Operation接口,其實也就是下面類圖中的AbstractProduct,就是名字不一樣而已。
具體產品角色:工廠類所創建的對象就是此角色的實例。在java中由一個具體類實現,如例子中的Addtion、Subtraction、Multiplication、Division類。
來用類圖來清晰的表示下的它們之間的關係:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章