设计模式2——简单工厂模式
定义:将多个类对象交给工厂来生成的设计方式。
优势:让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可,从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。
缺陷:当产品修改时,工厂类也要做相应的修改。
示例代码
package com.wangyin;
/**
* ClassName: Computer
* Function:
* Date: 2015/11/5 20:58
*
* @author liwenming
* @since JDK 1.6
*/
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 of = new OutputFactory();
Computer c = new Computer(of.getOutput());
c.keyIn("轻量级Java EE 企业应用实战");
c.keyIn("疯狂Java讲义");
c.print();
}
}
package com.wangyin;
/**
* ClassName: OutputFactory
* Function:
* Date: 2015/11/5 21:03
*
* @author liwenming
* @since JDK 1.6
*/
public class OutputFactory {
public Output getOutput(){
return new BetterPrinter();
}
}
package com.wangyin;
/**
* ClassName: Output
* Function:
* Date: 2015/11/5 21:07
*
* @author liwenming
* @since JDK 1.6
*/
public interface Output {
public void getData(String msg);
public void out();
}
package com.wangyin;
/**
* ClassName: BetterPrinter
* Function:
* Date: 2015/11/6 10:13
*
* @author liwenming
* @since JDK 1.6
*/
public class BetterPrinter implements Output {
private static Integer MAX_CACHE_LINE = 0;
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);
}
}
}
package com.wangyin;
/**
* ClassName: Printer
* Function:
* Date: 2015/11/5 21:04
*
* @author liwenming
* @since JDK 1.6
*/
public class Printer implements Output {
private static Integer MAX_CACHE_LINE = 10;
private String[] printData = new String[MAX_CACHE_LINE];
private int dataNum = 0;
@Override
public void out(){
while (dataNum>0){
System.out.println("打印机打印: " + printData[0]);
System.arraycopy(printData,1,printData,0,--dataNum);
}
}
@Override
public void getData(String msg){
if(dataNum>=MAX_CACHE_LINE){
System.out.println("输出队列已满,添加失败");
}else {
printData[dataNum++] = msg;
}
}
}