java设计模式(2):工厂方法模式(Factory Method)(一)

2014-11-23 23:19:29 · 作者: · 浏览: 0

在实际应用中,很可能产品是一个多层次的树状结构。

由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员,于是工厂方法模式作为救世主出现了。

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。


你应该大致猜出了工厂方法模式的结构,来看下它的组成:

抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java 中它由抽象类或者接口来实现。具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。抽象产品角色:它是具体产品继承的父类或者是实现的接口。在 java 中一般有抽象类或者接口来实现。具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在 java 中由具体的类来实现。

用类图来清晰的表示下的它们之间的关系:
vcfJq7XEtuC49tfTwODAtLT6zOa88rWluaSzp8Sjyr3W0LXEobDJz7XbwOChsaGj1f3I58nPw+bL+cu1o6zV4tH5seO31rWjwcu21M/zs9DK3LXE0bnBpqO7tvjH0tXi0fnKubXDveG5ubHktcPB6bvuxvDAtKGjPC9wPgo8cD48YnI+CjwvcD4KPHA+ICAgICAgICC1sdPQ0MK1xLL6xrey+sn6yrGjrNa70qqwtNXVs+nP87L6xre9x8mroaKz6c/zuaSzp73HyavM4bmptcS6z82swLTJ+rPJo6zEx8O0vs2/ydLUsbu/zbunyrnTw6Ostviyu7HYyKXQ3rjEyM66ztLR09C1xLT6wuuho7/J0tS/tLP2uaSzp73Hyau1xL3hubnSssrHt/u6z7+qsdXUrdTytcSjoTwvcD4KPHA+PGJyPgo8L3A+CjxwPiAgICAgICAgztLDx7u5ysfAz7nmvtijrMq508PSu7j2zerV+7XEwP3X08C0v7S/tLmks6fEo8q9uPe49r3HyavWrrzkysfI57rOwLTQrbX3tcSho7uwy7W73cbVuavLvtDo0qrWxtTsuPy24MDg0M21xLTy06G7+qOsxtXNqLTy06G7+tPQusO8uLj2xrfW1qOsuN/L2bTy06G7+tKy09C6w7y4uPbGt9bWo6zI57n7try3xdTa0ru49rmks6fJ+rL6o6y74c/UtcPU08LSzt7VwqOs1eLPwrvdxtW5q8u+s8nBy8G9uPa5pLOnsr/DxaOs0ru49teow8W4utTwyfqy+sbVzai08tOhu/qjrNK7uPbXqMPFuLrU8Mn6svq438vZtPLTobv6oaPT2srHo6y5pLOnt723qMSjyr21xLncwO2z9s/WwcuhozwvcD4KPHA+PGJyPgo8L3A+CjxwPrT6wuvI58/Co7o8L3A+CjxwPrPpz/Oy+sa3vcfJq6OoztLDx7ao0uXBy9K7uPa08tOhu/qjqTxicj4KPC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;">public abstract class Printer { public abstract void out(); public abstract void getData(String msg); }


具体产品角色(我们定义两个产品,一个是普通打印机,一个是高速打印机)

/*
 * 高速打印机
 */
public class BetterPrinter extends Printer
{
	private  final int MAX_CACHE_LINE = 10;
	private String[] printData = new String[MAX_CACHE_LINE * 2];
	
	private int dataNum = 0;

	@Override
	public void getData(String msg)
	{
		if(dataNum >= MAX_CACHE_LINE * 2)
		{
			System.out.println("输出队列已满,添加失败");
		}
		else
		{
			printData[dataNum++] = msg;
		}
	}

	@Override
	public void out()
	{
		while(dataNum>0)
		{
			System.out.println("高速打印机打印: "+printData[0]);
			
			System.arraycopy(printData,1,printData,0,--dataNum);
		}
	}
}


/*
 * 普通打印机
 */
public class CommonPrinter extends Printer
{
	private  final int MAX_CACHE_LINE = 10;
	private String[] printData = new String[MAX_CACHE_LINE];
	
	private int dataNum = 0;

	@Override
	public void getData(String msg)
	{
		if(dataNum >= MAX_CACHE_LINE)
		{
			System.out.println("输出队列已满,添加失败");
		}
		else
		{
			printData[dataNum++] = msg;
		}
	}

	@Override
	public void out()
	{
		while(dataNum>0)
		{
			System.out.println("普通打印机打印: "+printData[0]);
			
			System.arraycopy(printData,1,printData,0,--dataNum);
		}
	}
}

抽象工厂角色

public interface PrinterFactory
{
	public Printer getPrinter();
}

具体工厂角色(我们定义两个工厂,一个是普通打印机工厂,一个是高速打印机工厂)

/*
 * 高速打印机工厂,只返回高速打印机产品
 */
public class BetterPrinterFactory implements PrinterFactory
{

	public Printer getPrinter()
	{
		return new BetterPrinter();
	}
}


/*
 * 普通打印机工厂,只返回普通打印机产品
 */
public class CommonPrinterFactory implements PrinterFactory
{

	public Printer getPrinter()
	{
		return new C