定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到其子类。
/**
* 导出内容成为文件
*/
public interface ExportFileApi{
/**
* 导出内容成为文件
*/
public boolean export(String data);
}
//导出成文本文件格式
public class ExportTxtFile implements ExportFileApi{
public boolean export(String data){
System.out.println("导出数据"+data+"到文本文件");
return true;
}
}
//导出成文本DB格式
public class ExportDB implements ExportFileApi{
public boolean export(String data){
System.out.println("导出数据"+data+"到DB文件");
return true;
}
}
/**
* 实现导出数据的业务功能对象
*/
public class ExportOperate{
/**
* 导出文件
*/
public boolean export(int type,String data){
//先完成各种导出数据前的准备工作
System.out.println("now 进行数据校验");
System.out.println("now 进行数据转换");
System.out.println("now 进行数据格式的封装);
//然后才真正的去导出
ExportFileApi api = null;
/**
这是写了很多逻辑业务,调用哪种对象不应该在这写,扩展不易
if(type === 1){
api = new ExportTxtFile();
}else if(type == 2){
api = new ExportDB();
}*/
api = factoryMethod();
return api.export(data);
}
/**
* 工厂方法,创建导出的文件对象的接口对象
*/
protected abstract ExportFileApi factoryMethod();
}
//具体的创建器实现对象,实现创建导出成数据库备份文件形式的对象
public class ExportDBOprate extends ExportOperate{
protected ExportFileApi factoryMethod(){
return new ExportDB();
}
}
//具体的创建器实现对象,实现创建导出成文本文件形式的对象
public class ExportTxtFileOprate extends ExportOperate{
protected ExportFileApi factoryMethod(){
return new ExportTxtFile();
}
}
//客户端
public class Client{
public static void main(String[] args){
//ExportOperate operate = new ExportOperate();
//operate.export(1,"测试数据");
ExportOperate operate = new ExportDBOperate();
operate.export("测试数据");
}
}
认识工厂方法模式
1:工厂方法模式的功能
工厂方法的主要功能是让父类在不知道具体实现的情况下,完成自身的功能调用,而具体的实现延迟到子类来实现。
2:实现成抽象类
工厂方法的实现中,通常父类会是一个抽象类,里面包含创建所需对象的抽象方法,这些抽象方法就是工厂方法。
3:实现成具体的类
也可以把父类实现成为一个具体的类,这种情况下,通常是在父类中提供获取所需对象的默认实现方法,这样就算没有具体的子类,也能运行。
4:工厂方法的参数和返回值
工厂方法的实现中,可能需要参数,以便解决到底选用哪一种具体的实现。一般工厂方法返回的是被创建对象的接口对象,当然也可以是抽象类或者一个具体的类的实例。
5:谁来使用工厂方法创建的对象
(1)在工厂方法模式里面,应该是Creator中的其他方法在使用工厂方法创建的对象
(2)客户端应该是使用Creator对象,或者是使用由Creator创建出来的对象,这个时候工厂方法创建的对象,是Creator中的某些方法使用。
工厂方法模式与IoC/DI
依赖注入:应用程序依赖容器创建并注入它所需要的外部资源。
控制反转:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。