一天一个设计模式:工厂方法模式
工厂方法模式:
定义一个生产产品对象的工厂接口,将创建生产产品的工厂的工作交给子类实现。
随着实际需要的工厂数量增加,简单工厂模式体积会迅速膨胀,代码迅速臃肿严重。
补充:工厂方法模式是针对一类产品的工厂
所以为了代码的可阅读下与可维护性,也做到不同的业务有一定的隔离,将工厂的功能抽象出来成一个接口。
工厂模式的结构:
抽象工厂角色: 负责定义工厂的各个功能,是个抽象接口,所有的生产工厂都需要实现它。
具体工厂角色: 实现抽象工厂,针对不同的产品进行生产。
抽象产品角色: 是工厂生产的产品的抽象
具体产品角色: 是工厂生产的具体的产品。
实例:
抽象工厂:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface ExportFactory {
public ExportFile factory(String type);
}
具体工厂:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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("没有找到对象");
}
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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("没有找到对象");
}
}
}
抽象产品:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface ExportFile {
public boolean export(String data);
}
具体产品:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class ExportFinancialHtmlFile implements ExportFile{
@Override
public boolean export(String data) {
// TODO Auto-generated method stub
/**
* 业务逻辑
*/
System.out.println("导出财务版HTML文件");
return true;
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class ExportFinancialPdfFile implements ExportFile{
@Override
public boolean export(String data) {
// TODO Auto-generated method stub
/**
* 业务逻辑
*/
System.out.println("导出财务版PDF文件");
return true;
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class ExportStandardHtmlFile implements ExportFile{
@Override
public boolean export(String data) {
// TODO Auto-generated method stub
/**
* 业务逻辑
*/
System.out.println("导出标准HTML文件");
return true;
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class ExportStandardPdfFile implements ExportFile {
@Override
public boolean export(String data) {
// TODO Auto-generated method stub
/**
* 业务逻辑
*/
System.out.println("导出标准PDF文件");
return true;
}
}
测试代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String data = "";
ExportFactory exportFactory = new ExportHtmlFactory();
ExportFile ef = exportFactory.factory("financial");
ef.export(data);
}
}
工厂方法模式与简单工厂模式:
工厂方法模式和简单工厂模式在结构上的不同很明显。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么不妨把抽象工厂类合并到具体工厂类中去。由于只有一个具体工厂类,所以不妨将工厂方法改为静态方法,这时候就得到了简单工厂模式。
如果系统需要加入一个新的导出类型,那么所需要的就是向系统中加入一个这个导出类以及所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的导出类型而言,这个系统完全支持“开-闭原则”。
其实是在简单工厂的基础上再进行一层抽象,进行一个维度的解耦与简化。方便后来代码的维护与可阅读性。
参考链接:
https://www.cnblogs.com/java-my-life/archive/2012/03/25/2416227.html
https://www.cnblogs.com/xrq730/p/4905578.html