@@@模式定义:
定义一个用于创建对象(interface)的接口(这里的"接口"不是指interface而是method),
让子类(通过override父类创建interface的method来)决定实例化哪一个类,
Factory Method使一个类(interface)的实例化延迟到其(指Factory Method所在的类)子类。
@@@练习示例:
导出数据的应用框架。
@@@示例代码:
src/export/ExportFileApi.java
src/export/ExportTxtFile.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/export/ExportDB.java
~~~~~~~~~~~~~~~~~~~~~~~~
src/export/ExportOperate.java
src/export/ExportDBOperate.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/export/ExportXml.java
~~~~~~~~~~~~~~~~~~~~~~~~~
src/export/ExportOperate2.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/user/Client.java
~~~~~~~~~~~~~~~~~~~~
@@@工厂方法模式的实现:
1. 一般实现成抽象类
2. 也可以实现成具体的类
3. 可以通过给工厂方法传递参数来选择实现
4. 工厂方法一般返回的是被创建对象的接口对象
5. 在工厂方法模式里面,是Creator中的其他方法在使用工厂方法创建的对象
6. 工厂方法一般不提供给外部使用(用protected修饰)
7. 可以使用工厂方法模式来连接平行的类层次
@@@工厂方法模式的优点 :
1. 可以在不知道所依赖的对象的具体实现的情况下编程
2. 更容易扩展对象的新版本
@@@工厂方法模式的缺点 :
1. 具体产品对象和工厂方法的耦合性
@@@工厂方法模式的本质:
延迟到子类来选择实现
@@@工厂方法模式体现的设计原则 :
依赖倒置原则
定义一个用于创建对象(interface)的接口(这里的"接口"不是指interface而是method),
让子类(通过override父类创建interface的method来)决定实例化哪一个类,
Factory Method使一个类(interface)的实例化延迟到其(指Factory Method所在的类)子类。
@@@练习示例:
导出数据的应用框架。
@@@示例代码:
src/export/ExportFileApi.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;
/**
* 导出文件对象的接口
*/
public interface ExportFileApi {
/**
* 导出内容成为文件
* @param data: 示意需要保存的数据
* @return 是否导出成功
*/
public boolean export(String data);
}
src/export/ExportTxtFile.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;
/**
* 导出成文本文件格式的对象
*/
public class ExportTxtFile implements ExportFileApi {
public boolean export(String data) {
//简单示意一下,这里需要操作文件
System.out.println("导出数据" + data + "到文本文件");
return true;
}
}
src/export/ExportDB.java
~~~~~~~~~~~~~~~~~~~~~~~~
package export;
/**
* 导出成数据库备份文件形式的对象
*/
public class ExportDB implements ExportFileApi {
public boolean export(String data) {
//简单示意一下,这里需要操作数据库和文件
System.out.println("导出数据" + data + "到数据库备份文件");
return true;
}
}
src/export/ExportOperate.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;
/**
* 实现导出数据的业务功能对象
*/
public class ExportOperate {
/**
* 导出文件
* @param type 用户选择的导出类型
* @param data 需要保存的数据
* @return 是否成功导出文件
*/
public boolean export(int type, String data) {
//使用工厂方法
ExportFileApi api = factoryMethod(type);
return api.export(data);
}
/**
* 工厂方法,创建导出的文件对象的接口对象
* @param type 用户选择的导出类型
* @return 导出的文件对象的接口对象
*/
protected ExportFileApi factoryMethod(int type) {
ExportFileApi api = null;
if (1 == type) {
api = new ExportTxtFile();
} else if (2 == type) {
api = new ExportDB();
}
return api;
}
}
src/export/ExportTxtFileOperate.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;
/**
* 具体的创建器实现对象,实现创建导出成文本格式的对象
*/
public class ExportTxtFileOperate extends ExportOperate {
protected ExportFileApi factoryMethod() {
//创建导出成文本格式的对象
return new ExportTxtFile();
}
}
src/export/ExportDBOperate.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;
/**
* 具体的创建器实现对象,实现创建导出成数据库备份文件形式的对象
*/
public class ExportDBOperate extends ExportOperate {
protected ExportFileApi factoryMethod() {
//创建导出成文本格式的对象
return new ExportDB();
}
}
src/export/ExportXml.java
~~~~~~~~~~~~~~~~~~~~~~~~~
package export;
/**
* 导出成xml文件的对象
*/
public class ExportXml implements ExportFileApi {
public boolean export(String data) {
// 简单示意一下
System.out.println("导出数据" + data + "到XML文件");
return true;
}
}
src/export/ExportOperate2.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package export;
/**
* 扩展ExportOperate对象,加入可以导出的XML文件
*/
public class ExportOperate2 extends ExportOperate {
/**
* 覆盖父类的工厂方法,创建导出的文件对象的接口对象
* @param type 用户选择的导出类型
* @return 导出的文件对象的接口对象
*/
protected ExportFileApi factoryMethod(int type) {
ExportFileApi api = null;
// 可以全部覆盖,也可以选择自己感兴趣的覆盖
// 这里只添加自己新的实现,其他的不管
if (3 == type) {
api = new ExportXml();
} else {
// 其他的还是让父类来实现
api = super.factoryMethod(type);
}
return api;
}
}
src/user/Client.java
~~~~~~~~~~~~~~~~~~~~
package user;
import export.ExportOperate;
import export.ExportOperate2;
public class Client {
public static void main(String[] args) {
// 创建需要使用的Creator对象
ExportOperate operate = new ExportOperate2();
// 下面变换传入的参数来测试参数化工厂方法
operate.export(1, "Test1");
operate.export(2, "Test2");
operate.export(3, "Test3");
}
}
@@@工厂方法模式的实现:
1. 一般实现成抽象类
2. 也可以实现成具体的类
3. 可以通过给工厂方法传递参数来选择实现
4. 工厂方法一般返回的是被创建对象的接口对象
5. 在工厂方法模式里面,是Creator中的其他方法在使用工厂方法创建的对象
6. 工厂方法一般不提供给外部使用(用protected修饰)
7. 可以使用工厂方法模式来连接平行的类层次
@@@工厂方法模式的优点 :
1. 可以在不知道所依赖的对象的具体实现的情况下编程
2. 更容易扩展对象的新版本
@@@工厂方法模式的缺点 :
1. 具体产品对象和工厂方法的耦合性
@@@工厂方法模式的本质:
延迟到子类来选择实现
@@@工厂方法模式体现的设计原则 :
依赖倒置原则