实现过程: 通过这种简单工厂方式,即可把所有生成 Output 对象的逻辑集中在 OutputFactory 工厂类中管理,而所有需要使用 Output 对象的类只需要与 Output 接口耦合,而不是与具体的实现类耦合.即使系统中有很多类使用了 Printer 对象,只要 OutputFactory 类的 getOutput 方法生成的 Output 对象是 BetterPrinter 对象,则它们全部都会改为使用 BetterPrinter 对象,而所有程序无须修改,只需要修改 OutputFactory 工厂类的 getOutput 方法实现即可
假设让 Computer 类组合一个 Printer 对象,如果有一天系统需要重构,需要使用 BetterPrinter 来代替 Printer,这就需要打开 Computer 类源代码进行修改.如果系统中只有一个 Computer 类组合了 Printer 还好,但如果系统中有 100 个类组合了 Printer,甚至 1000 个,10000 个......将意味着需要打开 100 个,1000 个,10000 个类进行修改,这是多大的工作量啊!
为了避免这个问题,工厂模式建议让 Computer 类组合一个 Output 类型的对象,将 Computer 类与 Printer 类完全分离.Computer 对象实际组合的是 Printer 对象还是 BetterPrinter 对象,对 Computer 而言完全透明.当 Printer 对象切换到 BetterPrinter 对象时,系统完全不受影响.下面是这个 Computer 类的定义代码:
/**
* Computer组合一个打印机功能
*/
public class Computer {
private Output output;
public Computer(Output output){
this.output = output;
}
// 定义一个模拟获取字符串输入的方法
public void keyIn(String msg){
output.getData(msg);
}
// 定义一个模拟打印的方法
public void print(){
output.out();
}
}
/**
* 打印机接口
*/
public interface Output {
int MAX_CACHE_LINE = 10;
void getData(String msg); // 获取字符串输入的抽象方法
void out(); // 定义一个模拟打印的方法
}
/**
* 演示output工厂来生产output对象
*/
public class outputFactory {
public Output getOutput(){
return new BetterPrinter();
}
/**
* 程序入口
*/
public static void main(String[] args) {
outputFactory of = new outputFactory();
Computer c = new Computer(of.getOutput());
c.keyIn("java基础");
c.keyIn("java基础");
c.keyIn("java基础");
c.keyIn("java基础");
c.keyIn("java基础");
c.keyIn("java基础");
c.keyIn("java基础");
c.print();
}
}
/**
* 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;
}
}
}