工厂方法模式:定义 一个用于创建对象的接口,让子类决定实例化哪一个产品类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
首先是共用的产品接口:
package factorymethod;
public interface Output {
// 接口里定义的属性只能是常量
int MAX_CACHE_LINE = 50;
// 接口里定义的方法只能是public的抽象方法
void output();
void getData(String msg);
}
然后又具体的产品类继承自产品接口:
package factorymethod;
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 factorymethod;
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 factorymethod;
public abstract class Factory {
abstract Output getOutput();
}
具体工厂类分别继承了 抽象工厂类,用以实例化对应的具体产品类 对象。
package factorymethod;
public class PrinterFactory extends Factory {
@Override
Output getOutput() {
// TODO Auto-generated method stub
return new Printer();
}
}
package factorymethod;
public class BetterPrinterFactory extends Factory {
@Override
Output getOutput() {
// TODO Auto-generated method stub
return new BetterPrinter();
}
}
工厂方法模式至此完成,下面写个客户端实例测试一下:
package factorymethod;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//获取具体的工厂类,生成对应的具体产品类对象
Factory factory = new PrinterFactory();
Output output = factory.getOutput();
factory = new BetterPrinterFactory();
output = factory.getOutput();
}
}
可以看到,当我们想要Printer对象时,就要获取PrinterFactory,当我们想要生产BetterPrinter对象时,就需要获取BetterPrinterFactory对象。这是对应的。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。