工厂方法Factory Method

工厂方法模式:定义 一个用于创建对象的接口,让子类决定实例化哪一个产品类。工厂方法使一个类的实例化延迟到其子类。

工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的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对象。这是对应的。

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值