工厂方法模式
1.定义
定义个一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。
2.示例代码
/*导出的文件对象接口,即工厂方法所创建的对象接口*/ public interface ExportFileApi{ public boolean export(String data); } /*导出txt格式的实现类*/ public class ExportTxtFile implements ExportFileApi{ public boolean export(String data){ System.out.println("导出data到文本文件"); return true; } } /*导出到数据库备份的实现类*/ public class ExportDB implements ExportFileApi{ public boolean export(String data){ System.out.println("导出data到数据库备份"); return true; } }
/*实现导出数据的业务功能对象,即工厂创建器*/ public abstract class ExportOperate{ public boolean export(String data){ //使用工厂方法 ExportFileApi api = factoryMethod(); return api.export(data); } //工厂方法,创建导出文件对象的接口对象 protected abstract ExportFileApi factoryMethod(); } /*子类工厂创建导出txt文本的数据导出对象*/ public class ExportTxtFileOperate extends ExportOperate{ protected ExportFileApi factoryMethod(){ //创建导出成文本文件格式的对象 return new ExportTxtFile(); } } /*子类工厂创建导出数据库DB备份对象*/ public class ExportDBOperate extends ExportOperate{ protected ExportFileApi factoryMethod(){ //创建导出成文本文件格式的对象 return new ExportDB(); } }
/*客户端自主选择导出txt还是导出到数据库备份*/ public class Client{ public static void main(String args[]){ //创建需要使用的数据导出对象 ExportOperate operate = new ExportDBOperate(); //调用输出数据的功能方法 operate.export("测试数据"); } }
3.实际应用
工厂方法可以让你在实现功能的时候,如果需要某个产品对象,只需要产品的接口即可,而无需关心具体的实现。选择具体实现的任务延迟到子类去完成。工厂方法给子类提供了一个挂钩,使得扩展新的对象版本变得非常容易。比如需要扩展一个导出xml格式的数据,只需新增一个子类来提供新的工厂方法实现,然后在客户端使用新的子类即可。
工厂方法模式的本质:延迟到子类来选择实现