简单工厂模式:(what,why,how)
什么是简单工厂模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。简单工厂模式只是设计模式里面相对简单的一个设计模式。它主要是让所有的类实现工厂化模式装配。
为什么要使用简单工厂模式
继承组合-----来实现这样A就依赖于B!假如这样的调用只有一处还好,但是系统可能会多次调用同时这种调用方式可能不仅仅是A调用B还有可能是B调用C这样无限制的耦合下去,这样代码耦合度太高,如过现在要改变B的话,需要修改的代码可能是多处,这样代码维护困难,况且一般代码的开发者和维护者不是同一个团队。于是产生了一个简单工厂模式,我们要用什么类可以用工厂的方法产生,我们只要去找这个“工厂”要就可以了。
如何使用简单工厂模式
例子:有一个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());
c.keyIn("今天很艰难");
c.keyIn("明天也很艰难");
c.keyIn("后天很美好");
c.print();
}
}
输出工厂类:
public class OutPutFactory {
public Output getOutput()
{
//下面两行代码用于控制系统到底使用Output的哪个实现类要哪个就return哪个。
//return new Printer();
return new Screen();
}
}
output接口:
public interface Output {//所有输出类要遵循相同的接口
int MAX_CACHE_LINE = 50;
public void out();
public void getData(String msg);
}
打印机输出类:
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]);
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;
}
}
}
屏幕输出类:
public class Screen 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;
}
}
}
这样当我们要变换输出的时候只要更改outputfactory类中的renturn语句就可以得到不同的输出对象。
程序运行结果:
输出到屏幕上:今天很艰难
输出到屏幕上:明天也很艰难
输出到屏幕上:后天很美好