package com.fsti.factory.factorymethod;public interface Output {public final static Integer MAX_CACHE_LINE = 3;void getData(String str);void out();}
package com.fsti.factory.factorymethod;public class Printer implements Output {private String[] printData = new String[MAX_CACHE_LINE];// 用以記錄當前需列印的作業數private int dataNum = 0;public void getData(String str) {if (dataNum >= MAX_CACHE_LINE) {System.out.println("輸出隊列一滿,添加失敗");} else {printData[dataNum++] = str;}}public void out() {while (dataNum > 0) {System.out.println("印表機列印:" + printData[0]);// 把作業整體前移一位,並將剩下的作業數減一System.arraycopy(printData, 1, printData, 0, --dataNum);}}}
package com.fsti.factory.factorymethod;public class BetterPrinter implements Output {private String[] printData = new String[MAX_CACHE_LINE];// 用以記錄當前需列印的作業數private int dataNum = 0;public void getData(String str) {if (dataNum >= MAX_CACHE_LINE) {System.out.println("輸出隊列一滿,添加失敗");} else {printData[dataNum++] = str;}}public void out() {while (dataNum > 0) {System.out.println("Better印表機列印:" + printData[0]);// 把作業整體前移一位,並將剩下的作業數減一System.arraycopy(printData, 1, printData, 0, --dataNum);}}}
package com.fsti.factory.factorymethod;public interface OutputFactory {Output getOutput();}
package com.fsti.factory.factorymethod;public class BetterPrinterFactory implements OutputFactory {public Output getOutput() {return new BetterPrinter();}}
package com.fsti.factory.factorymethod;public class PrinterFactory implements OutputFactory {public Output getOutput() {return new Printer();}}
package com.fsti.factory.factorymethod;public class Computer {private Output out;public Computer(Output out) {this.out = out;}public void keyIn(String str) {out.getData(str);}public void print() {out.out();}public static void main(String[] args) {// 用戶端代碼成功是與被調用對象的實作類別分類// 但帶來了另一種耦合:用戶端代碼與不同的工廠類別結合程度OutputFactory of = null;String type = "better";if (type.equals("better")) {of = new BetterPrinterFactory();} else {of = new PrinterFactory();}Computer c = new Computer(of.getOutput());c.keyIn("原廠模式之");c.keyIn("Factory 方法模式");c.print();}}
採用Factory 方法設計的架構,用戶端代碼成功是與被調用對象的實作類別分類,但帶來了另一種耦合:用戶端代碼與不同的工廠類別結合程度。