接着来看工厂模式,工厂方法模式是类的创建模式,又叫做虚拟构造子(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 {
//Pdf格式的工厂,有standard和financial两种类型
@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("没有找到对象"); } }}
(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("打印失败");
}
}
}
工厂模式到这就介绍完了。
可以看出,工厂模式将简单工厂模式又做了细分,简单工厂模式是将所有的逻辑都写在一个具体工厂里,而工厂模式是定义一个接口(抽象工厂),让多个具体工厂实现这个接口,而每个具体工厂则可以处理一种具体的事物(他有多种类型),这也便是工厂模式的核心。