目录
场景问题
名词解释
框架是什么?
能完成一定功能的半成品软件
框架能干什么?
1.能完成一定功能,加快应用开发进度
2.给我们一个精良的程序架构
存在的问题
不管用户选择社么样的导出格式,最后导出的都是一个文件,而且系统并不知道究竟要导出成为什么样的文件,因此应该有一个统一的接口来描述系统最后生成的对象,并操作输出的文件。
代码示例
导出文件接口
package day04单例模式.day05工厂方法模式;
/**
* 导出文件接口
*/
public interface ExportFileApi {
/**
* 导出内容成为文件
* @param data 需要保存的数据
* @return 是否导出成功
*/
public boolean export(String data);
}
但是此时我们不知道应该怎么实现这个接口的Impl,因为我们不清楚文件格式对象是什么样子的。
系统也不知道你要选择什么样的具体实现,那我让你用户自己选择。
工厂方法模式的定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。
工厂方法模式结构图
通过代码来看
Product就是接口,一个公共的export接口
package day05工厂方法模式;
/**
* 导出文件接口 Product
*/
public interface ExportFileApi {
/**
* 导出内容成为文件
* @param data 需要保存的数据
* @return 是否导出成功
*/
public boolean export(String data);
}
ConcreteProduct就是Product的实现类,我这里定义了两个
package day05工厂方法模式;
/**
* 导出成数据库备份文件形式的对象 ConcreteProduct
*/
public class ExportDB implements ExportFileApi{
@Override
public boolean export(String data) {
System.out.println("导出数据"+data+"到数据库备份文件");
return true;
}
}
package day05工厂方法模式;
/**
* 导出成文本文件格式的对象 ConcreteProduct
*/
public class ExportTxtFile implements ExportFileApi{
@Override
public boolean export(String data) {
System.out.println("导出数据"+data+"到文本文件");
return true;
}
}
Creator创建器:首先他是一个抽象类,包含一个返回值为Product(也就是接口的方法,我们叫做工厂方法,也是一个抽象方法),还有一个公共的方法,也就是调用Product(接口里面的方法,一般是共有的,只是实现类不一样)
package day05工厂方法模式.factory;
import day05工厂方法模式.ExportFileApi;
/**
* 实现导出数据的业务功能对象 Creator
*/
public abstract class ExportOperate {
/**
* 工厂方法,创建导出的文件对象的接口对象(抽象方法)
* @return
*/
protected abstract ExportFileApi factoryMethod();
/**
* 导出文件
* @param data 需要保存的数据
* @return 是否成功导出文件
*/
public boolean export(String data){
// 使用工厂方法
ExportFileApi api = factoryMethod();
return api.export(data);
}
}
ConcreteCreator:具体的创建器对象,也就是对Creator这个抽象类的继承,并覆盖抽象方法,在抽象方法里面,定义你想选择的具体实现对象,也就是ConcreteProduct。返回值就是具体的Product实例。我这里还是定义了两个
package day05工厂方法模式.factory;
import day05工厂方法模式.ExportDB;
import day05工厂方法模式.ExportFileApi;
/**
* 具体的创建器实现对象,实现创建导出成数据库备份文件格式的对象 ConcreteCreator
*/
public class ExportDBOperate extends ExportOperate{
@Override
protected ExportFileApi factoryMethod() {
/**
* 创建导出成数据库备份文件格式的对象
*/
return new ExportDB();
}
}
package day05工厂方法模式.factory;
import day05工厂方法模式.ExportFileApi;
import day05工厂方法模式.ExportTxtFile;
/**
* 具体的创建器实现对象,实现创建导出成文本文件格式的对象 ConcreteCreator
*/
public class ExportTxtFileOperate extends ExportOperate{
@Override
protected ExportFileApi factoryMethod() {
/**
* 创建导出成文本文件格式的对象
*/
return new ExportTxtFile();
}
}
Client
工厂方法模式的优缺点
何时选用
设计原则提现
依赖倒置