将多个类对象交给工厂类来生成的设计方式称为简单工厂模式。可能这样说,大伙会比较难以理解。下面我们打个比方。现在我们有两台打印机,一台是普通的打印机,那么实验室的打印就是普通打印,我们取名为:Printer; 当然我们还有一如打印,是快速打印,所以我们取名为BetterPrinter。现在有一台电脑,它去调用打印机,如果初学者,可能用的方法就是,直接使用那个,那么就去new哪个。而工厂模式的使用会我们,将所有一类的对给工厂去管理,就里我们定义为OutputFactory,那么电脑要使用哪打印机,就直接向OutputFactory去调用就行了。下面笔者给出的UML类图。
下面我们来这实现上面的设计。
1) 实现个Printer的类。
/ 让Printer类实现Output
public class Printer implements Output
{
private String[] printData = new String[MAX_CACHE_LINE];
// 用以记录当前需打印的作业数
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)
{
System.out.println("输出队列已满,添加失败");
}
else
{
// 把打印数据添加到队列里,已保存数据的数量加1。
printData[dataNum++] = msg;
}
}
}
2) 实现一个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;
}
}
}
3) 实现一个接口Output.
public interface Output
{
// 接口里定义的属性只能是常量
int MAX_CACHE_LINE = 50;
// 接口里定义的只能是public的抽象实例方法
void out();
void getData(String msg);
}
4) 创建个工厂OutputFactory.
public class OutputFactory
{
public Output getOutput(String name)
{
//下面两行代码用于控制系统到底使用Output的哪个实现类。
if("printer".equals(name)){
return new Printer();
} else {
return new BetterPrinter();
}
}
}
5) 创建个Computer。
public class Computer
{
private Output out;
public Computer(Output out)
{
this.out = out;
}
// 定义一个模拟获取字符串输入的方法
public void keyIn(String msg)
{
out.getData(msg);
}
// 定义一个模拟打印的方法
public void print()
{
out.out();
}
public static void main(String[] args)
{
// 创建OutputFactory
OutputFactory of = new OutputFactory();
// 将Output对象传入,创建Computer对象
Computer c = new Computer(of.getOutput("printer"));
c.keyIn("printer:owen");
c.keyIn("printer:william");
c.print();
// 将Output对象传入,创建Computer对象
Computer c1 = new Computer(of.getOutput(""));
c1.keyIn("betterPrinter:轻量级Java EE企业应用实战");
c1.keyIn("betterPrinter:疯狂Java讲义");
c1.print();
}
}
6) 执行结果。