简单工厂模式:(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语句就可以得到不同的输出对象。



程序运行结果:


输出到屏幕上:今天很艰难
输出到屏幕上:明天也很艰难
输出到屏幕上:后天很美好