接着上一节的设计模式,我们这里增加一个OutputFactoryFactory工厂类,这个工厂类提供一个getOutputFactory(String type)方法,该方法用于返回一个OutputFactory工厂实例。这个特殊的工厂我们称之为抽象工厂,下面是抽象工厂的UML类图。
下面笔者给出实现的代码。
1) OutputFactoryFactory的类。
public class OutputFactoryFactory { // 仅定义一个方法用于返回输出设备。 public static OutputFactory getOutputFactory( String type) { if (type.equalsIgnoreCase("better")) { return new BetterPrinterFactory(); } else { return new PrinterFactory(); } } }
2) OutoutFactory的类。
public interface OutputFactory { // 仅定义一个方法用于返回输出设备。 Output getOutput(); }
3) PrinterFactory的类。
public class PrinterFactory implements OutputFactory { public Output getOutput() { // 该工厂只负责产生Printer对象 return new Printer(); } }
4) Printer的类。
// 让Printer类实现Output public class Printer implements Output { private String[] printData = new String[MAX_CACHE_LINE]; // 用以记录当前需打印的作业数 private int dataNum = 0; public void out() { // 只要还有作业,继续打印 while(dataNum > 0) { System.out.println("打印机打印:" + printData[0]); // 把作业队列整体前移一位,并将剩下的作业数减1 System.arraycopy(printData , 1, printData, 0, --dataNum); } } public void getData(String msg) { if (dataNum >= MAX_CACHE_LINE) { System.out.println("输出队列已满,添加失败"); } else { // 把打印数据添加到队列里,已保存数据的数量加1。 printData[dataNum++] = msg; } } }
5) BetterPrinterFactory的类。
public class BetterPrinterFactory implements OutputFactory { public Output getOutput() { // 该工厂只负责产生BetterPrinter对象 return new BetterPrinter(); } }
6) BetterPrinter的类。
public class BetterPrinter implements Output { private String[] printData = new String[MAX_CACHE_LINE * 2]; // 用以记录当前需打印的作业数 private int dataNum = 0; public void out() { // 只要还有作业,继续打印 while(dataNum > 0) { System.out.println("高速打印机正在打印:" + printData[0]); // 把作业队列整体前移一位,并将剩下的作业数减1 System.arraycopy(printData , 1, printData, 0, --dataNum); } } public void getData(String msg) { if (dataNum >= MAX_CACHE_LINE * 2) { System.out.println("输出队列已满,添加失败"); } else { // 把打印数据添加到队列里,已保存数据的数量加1。 printData[dataNum++] = msg; } } }
7) Output的类。
public interface Output { // 接口里定义的属性只能是常量 int MAX_CACHE_LINE = 50; // 接口里定义的只能是public的抽象实例方法 void out(); void getData(String msg); }
8) Computer的类。
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.out(); } public static void main(String[] args) { // 使用OutputFactoryFactory工厂类创建OutputFactory OutputFactory of = OutputFactoryFactory .getOutputFactory("better"); // 调用OuputFactory的方法获取Output对象, // 并将Output对象传入,创建Computer对象 Computer c = new Computer(of.getOutput()); c.keyIn("BetterPrinter:owen"); c.keyIn("BetterPrinter:william"); c.print(); // 使用OutputFactoryFactory工厂类创建OutputFactory OutputFactory of1 = OutputFactoryFactory .getOutputFactory(""); // 调用OuputFactory的方法获取Output对象, // 并将Output对象传入,创建Computer对象 Computer c1 = new Computer(of1.getOutput()); c1.keyIn("Printer:owen"); c1.keyIn("Printer:william"); c1.print(); } }
9) 执行结果。