簡單工廠模式Static Factory Method

簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類或繼承自同一接口。

下面的例子介紹,如何使用靜態工廠方法模式生成包含不同打印機對象的計算機對象。

首先是被創建的實例具有相同的接口:

package designPattern;

public interface Output {

	// 接口裏定義的屬性只能是常量
	int MAX_CACHE_LINE = 50;

	// 接口裏定義的方法只能是public的抽象方法
	void output();

	void getData(String msg);
}
然後定義兩個子類實現接口Output:打印機Printer和高級打印機BetterPrinter。

package designPattern;

public class Printer implements Output {

	private String[] printData = new String[MAX_CACHE_LINE];
	private int dataNum = 0;

	@Override
	public void output() {
		// TODO Auto-generated method stub
		while (dataNum > 0) {
			System.out.println("打印機打印:" + printData[0]);
			System.arraycopy(printData, 1, printData, 0, --dataNum);
		}
	}

	@Override
	public void getData(String msg) {
		// TODO Auto-generated method stub
		if (dataNum >= MAX_CACHE_LINE) {
			System.out.println("輸出隊列已滿,添加失敗");
		} else {
			printData[dataNum++] = msg;
		}
	}

}

package designPattern;

public class BetterPrinter implements Output {

	private String[] printData = new String[MAX_CACHE_LINE * 2];
	private int dataNum = 0;

	@Override
	public void output() {
		// TODO Auto-generated method stub
		while (dataNum > 0) {
			System.out.println("高速打印機打印:" + printData[0]);
			System.arraycopy(printData, 1, printData, 0, --dataNum);
		}
	}

	@Override
	public void getData(String msg) {
		// TODO Auto-generated method stub
		if (dataNum >= MAX_CACHE_LINE * 2) {
			System.out.println("輸出隊列已滿,添加失敗");
		} else {
			printData[dataNum++] = msg;
		}
	}

}

現在是關鍵的簡單工廠類,也叫靜態工廠方法類,由它負責創建所有的類的內部邏輯。

package designPattern;

public class OutputFactory {

	// 靜態方法管理所有對象的生成
	public static Output getPrinterOutput(String type) {
		if (type.equalsIgnoreCase("better")) {
			return new BetterPrinter();
		} else {
			return new Printer();
		}
	}
}

簡單工廠模式已經構建完成,下面我們用個實例測試簡單工廠模式如何生產對象:

package designPattern;

public class Computer {

	private Output out;

	public Computer(Output out) {
		this.out = out;
	}

	public void keyIn(String msg) {
		out.getData(msg);
	}

	public void print() {
		out.output();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Computer computer = new Computer(
				OutputFactory.getPrinterOutput("normal"));
		computer.keyIn("建築永恆之道");
		computer.keyIn("建築模式語言");
		computer.print();

		computer = new Computer(OutputFactory.getPrinterOutput("better"));
		computer.keyIn("建築永恆之道");
		computer.keyIn("建築模式語言");
		computer.print();
	}

}


輸出結果:

打印機打印:建築永恆之道
打印機打印:建築模式語言
高速打印機打印:建築永恆之道
高速打印機打印:建築模式語言

簡單工廠模式優缺點分析:

優點:工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的信息,決定究竟應該創建哪個具體類的對象。用戶在使用時可以直接根據工廠類去創建所需的實例,而無需瞭解這些對象是如何創建以及如何組織的。有利於整個軟件體系結構的優化。

缺點:由於工廠類集中了所有實例的創建邏輯,違反了高內聚責任分配原則,將全部創建邏輯集中到了一個工廠類中;它所能創建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。
當系統中的具體產品類不斷增多時候,可能會出現要求工廠類根據不同條件創建不同實例的需求.這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免模塊功能的蔓延,對系統的維護和擴展非常不利;
這些缺點在工廠方法模式中得到了一定的克服。

使用場景:

工廠類負責創建的對象比較少;

客戶只知道傳入工廠類的參數,對於如何創建對象(邏輯)不關心;
由於簡單工廠很容易違反高內聚責任分配原則,因此一般只在很簡單的情況下應用。

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