在实际应用中,很可能产品是一个多层次的树状结构。
由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员,于是工厂方法模式作为救世主出现了。
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。
你应该大致猜出了工厂方法模式的结构,来看下它的组成:
用类图来清晰的表示下的它们之间的关系:
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