1. 程式人生 > >簡單工廠模式(Factory Pattern)

簡單工廠模式(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類。
來用類圖來清晰的表示下的它們之間的關係: