簡單工廠模式(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();
}
}
輸出結果:
打印機打印:建築永恆之道
打印機打印:建築模式語言
高速打印機打印:建築永恆之道
高速打印機打印:建築模式語言
簡單工廠模式優缺點分析:
優點:工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的信息,決定究竟應該創建哪個具體類的對象。用戶在使用時可以直接根據工廠類去創建所需的實例,而無需瞭解這些對象是如何創建以及如何組織的。有利於整個軟件體系結構的優化。
使用場景:
工廠類負責創建的對象比較少;