接着来看工厂模式,工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
工厂方法模式的实质是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。即定义一个总工厂(即抽象工厂)接口,在子工厂(即具体工厂)中实现总工厂接口里的方法,即在子工厂里创建具体的实例对象。
还继续上节的打印文件,现在要打印两种类型的文件,每种类型又有两种格式文件,分别为Html和Pdf,先定义一个总工厂,源代码如下:
public interface ExportFactory {
public ExportFile factory(String type);
}
(2)子工厂实现抽象工厂里的方法,即创建一种格式所有的类型的对象的逻辑
package com.studyart;
//Html格式的工厂,有standard和financial两种类型
public class ExportHtmlFactory implements ExportFactory{
@Override
public ExportFile factory(String type) {
// TODO Auto-generated method stub
if("standard".equals(type)){
return new ExportStandardHtmlFile();
}else if("financial".equals(type)){
return new ExportFinancialHtmlFile();
}else{
throw new RuntimeException("没有找到对象");
}
}
}
package com.studyart; public class ExportPdfFactory implements ExportFactory {
@Override public ExportFile factory(String type) { // TODO Auto-generated method stub if("standard".equals(type)){ return new ExportStandardPdfFile(); }else if("financial".equals(type)){ return new ExportFinancialPdfFile(); }else{ throw new RuntimeException("没有找到对象"); } }}//Pdf格式的工厂,有standard和financial两种类型
(3)在定义导出文件的接口,实现所有类型的格式文件的具体逻辑package com.studyart; public interface ExportFile { public boolean export(); } public class ExportFinancialHtmlFile implements ExportFile{ @Override public boolean export() { // TODO Auto-generated method stub /** * 业务逻辑 */ System.out.println("导出财务版HTML文件"); return true; } } public class ExportFinancialPdfFile implements ExportFile{ @Override public boolean export() { // TODO Auto-generated method stub /** * 业务逻辑 */ System.out.println("导出财务版PDF文件"); return true; } } public class ExportStandardHtmlFile implements ExportFile{ @Override public boolean export() { // TODO Auto-generated method stub /** * 业务逻辑 */ System.out.println("导出标准HTML文件"); return true; } } public class ExportStandardPdfFile implements ExportFile { @Override public boolean export() { // TODO Auto-generated method stub /** * 业务逻辑 */ System.out.println("导出标准PDF文件"); return true; } }
(4)测试工厂模式到这就介绍完了。package com.studyart; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub ExportFactory exportFactory = new ExportHtmlFactory(); ExportFile ef = exportFactory.factory("standard"); boolean bool = ef.export(); if (bool) { /** * 业务逻辑 */ System.out.println("打印成功"); } else { /** * 业务逻辑 */ System.out.println("打印失败"); } } }
可以看出,工厂模式将简单工厂模式又做了细分,简单工厂模式是将所有的逻辑都写在一个具体工厂里,而工厂模式是定义一个接口(抽象工厂),让多个具体工厂实现这个接口,而每个具体工厂则可以处理一种具体的事物(他有多种类型),这也便是工厂模式的核心。