工厂方法模式(Factory Method)

来源:互联网 发布:淘宝刷単软件用哪个好 编辑:程序博客网 时间:2024/05/22 15:10
@@@模式定义:
定义一个用于创建对象(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. 具体产品对象和工厂方法的耦合性


@@@工厂方法模式的本质:
延迟到子类来选择实现


@@@工厂方法模式体现的设计原则 :
依赖倒置原则