#设计模式
工厂方法模式,也叫作虚拟构造子模式,多态性工厂模式
#解释
定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中
#场景举例
导入导出功能,比如系统需要导出报表数据,那么就需要支持excel,pdf等格式
##流程
客户端创建ExportHtmlFactory对象,这时客户端所持有变量的静态类型为ExportFactory,而实际类型为ExportHtmlFactory。然后客户端调用ExportHtmlFactory对象的工厂方法factory(),接着后者调用ExportFinancialHtmlFile的构造子创建出导出对象
#简单工厂模式和工厂方法模式的区别
使用简单工厂模式则工厂类会过于臃肿,伴随着需求的增加,会出现越来越多的if/else;
使用工厂方法模式则工厂类不是负责所有的对象的创建。而是将具体的创建交给子类去做,这个核心类摇身一变就成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个类应当被实例化这种细节
#优点
进一步抽象,允许了系统在不修改具体工厂角色的情况下引进新的产品
#角色
抽象工厂角色:工厂的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类实现
具体工厂角色:实现了抽象工厂接口的具体JAVA类,具体工厂角色含有与业务密切相关的逻辑,并且受到使用者的调用以创建导出类(如:ExportStandardHtmlFile)
抽象导出角色:对象的超类,所有导出类的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常用抽象类来实现
具体导出角色:实现了抽象导出角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体导出对象的实例
源代码如下:
ExportFile.java
/******************************************************************
* 文件名称: csdn26.factoryMethod.ExportFile
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 15:33
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factoryMethod;
/**
* <p>Title: 抽象导出文件类</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 15:33
* @Version 1.0
*/
public interface ExportFile {
boolean export(String data);
}
ExportFactory.java
/******************************************************************
* 文件名称: csdn26.factoryMethod.ExportFactory
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 15:30
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factoryMethod;
/**
* <p>Title: 抽象工厂角色</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 15:30
* @Version 1.0
*/
public interface ExportFactory {
ExportFile getFactory(String type);
}
ExportHtmlFactory.java
/******************************************************************
* 文件名称: csdn26.factoryMethod.ExportHtmlFactory
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 15:31
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factoryMethod;
/**
* <p>Title: 具体工厂角色类</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 15:31
* @Version 1.0
*/
public class ExportHtmlFactory implements ExportFactory{
@Override
public ExportFile getFactory(String type) {
if("Standard".equals(type)){
ExportStandardHtmlFile exportStandardHtmlFile = new ExportStandardHtmlFile();
return exportStandardHtmlFile;
}else{
ExportFinancialHtmlFile exportFinancialHtmlFile = new ExportFinancialHtmlFile();
return exportFinancialHtmlFile;
}
}
}
ExportPdfFactory.java
/******************************************************************
* 文件名称: csdn26.factoryMethod.ExportPdfFactory
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 15:32
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factoryMethod;
/**
* <p>Title: 具体工厂角色表</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 15:32
* @Version 1.0
*/
public class ExportPdfFactory implements ExportFactory{
@Override
public ExportFile getFactory(String type) {
if("Standard".equals(type)){
ExportStandardPdfFile exportStandardPdfFile = new ExportStandardPdfFile();
return exportStandardPdfFile;
}else{
ExportFinancialPdfFile exportFinancialPdfFile = new ExportFinancialPdfFile();
return exportFinancialPdfFile;
}
}
}
ExportFinancialHtmlFile.java
/******************************************************************
* 文件名称: csdn26.factoryMethod.ExportFinancialHtmlFile
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 15:36
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factoryMethod;
/**
* <p>Title: 导出财务版HTML文件</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 15:36
* @Version 1.0
*/
public class ExportFinancialHtmlFile implements ExportFile{
@Override
public boolean export(String data) {
System.out.println("导出财务版HTML文件,数据为:"+data);
return true;
}
}
ExportFinancialPdfFile.java
/******************************************************************
* 文件名称: csdn26.factoryMethod.ExportFinancialPdfFile
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 15:37
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factoryMethod;
/**
* <p>Title: 导出财务版PDF文件</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 15:37
* @Version 1.0
*/
public class ExportFinancialPdfFile implements ExportFile{
@Override
public boolean export(String data) {
System.out.println("导出财务版PDF文件,数据为:"+data);
return true;
}
}
ExportStandardHtmlFile.java
/******************************************************************
* 文件名称: csdn26.factoryMethod.ExportStandardHtmlFile
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 15:37
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factoryMethod;
/**
* <p>Title: 导出标准HTML文件</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 15:37
* @Version 1.0
*/
public class ExportStandardHtmlFile implements ExportFile{
@Override
public boolean export(String data) {
System.out.println("导出标准HTML文件,数据为:"+data);
return true;
}
}
ExportStandardPdfFile.java
/******************************************************************
* 文件名称: csdn26.factoryMethod.ExportStandardPdfFile
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 15:38
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factoryMethod;
/**
* <p>Title: 导出标准PDF文件</p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 15:38
* @Version 1.0
*/
public class ExportStandardPdfFile implements ExportFile{
@Override
public boolean export(String data) {
System.out.println("导出标准PDF文件,数据为:"+data);
return true;
}
}
TestFactoryMethod.java
/******************************************************************
* 文件名称: csdn26.factoryMethod.TestFactoryMethod
* 系统名称: 设计模式大全
* 模块名称:
* 软件版权: Lucky
* 功能说明:
* 系统版本: 1.0
* 开发人员: Lucky
* 开发时间: 2021/8/6 15:38
* 修改记录:
* 程序版本 修改日期 修改人员 修改单号 修改说明
*******************************************************************/
package csdn26.factoryMethod;
import org.junit.Test;
/**
* <p>Title: </p>
* <p>Description: </p>
*
* @Author Lucky
* @Date 2021/8/6 15:38
* @Version 1.0
*/
public class TestFactoryMethod {
@Test
public void test(){
String type ="Standard";
String data ="行情数据";
ExportFactory factory = new ExportHtmlFactory();
factory.getFactory(type).export(data);
type = "Financial";
factory = new ExportPdfFactory();
factory.getFactory(type).export(data);
}
}