设计模式--工厂模式

设计模式--工厂模式

设计模式--工厂模式

 我们来看一下不是有工厂模式的代码

package cn.javass.dp.factorymethod.example3;
/**
 * 导出的文件对象的接口
 */
public interface ExportFileApi {
    /**
     * 导出内容成为文件
     * @param data 示意:需要保存的数据
     * @return 是否导出成功
     */
    public boolean export(String data);
}
package cn.javass.dp.factorymethod.example3;
/**
 * 导出成文本文件格式的对象
 */
public class ExportTxtFile implements ExportFileApi{
    public boolean export(String data) {
        //简单示意一下,这里需要操作文件
        System.out.println("导出数据"+data+"到文本文件");
        return true;
    }
}
package cn.javass.dp.factorymethod.example3;
/**
 * 导出成数据库备份文件形式的对象
 */
public class ExportDB implements ExportFileApi{
    public boolean export(String data) {
        //简单示意一下,这里需要操作数据库和文件
        System.out.println("导出数据"+data+"到数据库备份文件");
        return true;
    }
}
package cn.javass.dp.factorymethod.example1;
/**
 * 实现导出数据的业务功能对象
 */
public class ExportOperate {
    /**
     * 导出文件
     * @param type 用户选择的导出类型
     * @param data 需要保存的数据
     * @return 是否成功导出文件
     */
    public boolean export(int type,String data){
        ExportFileApi api = null;
        //根据类型来选择究竟要创建哪一种导出文件对象
        if(type == 1){
            api = new ExportTxtFile();
        }else if(type == 2){
            api = new ExportDB();
        }
        return api.export(data);
    }
}
package cn.javass.dp.factorymethod.example1;

public class Client {
    public static void main(String[] args) {
        ExportOperate operate = new ExportOperate();
        operate.export(2, "测试数据");
    }
}

上面就是使用简单工厂来实现数据的导出形式

当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

如果我们需要导出成XML形式

我们就要修改工厂的

public boolean export(int type,String data){
ExportFileApi api = null;
//根据类型来选择究竟要创建哪一种导出文件对象
if(type == 1){
api = new ExportTxtFile();
}else if(type == 2){
api = new ExportDB();
}
return api.export(data);

这个地方的代码。违背了违反了高内聚责任分配原则

我们可以使用工厂模式的办法来解决上面的问题

我们首先定义一个工厂操作的接口

package cn.javass.dp.factorymethod.example3;
/**
 * 实现导出数据的业务功能对象
 */
public abstract class ExportOperate {
    /**
     * 导出文件
     * @param data 需要保存的数据
     * @return 是否成功导出文件
     */
    public boolean export(String data){
        //使用工厂方法
        ExportFileApi api = factoryMethod();
        return api.export(data);
    }
    /**
     * 工厂方法,创建导出的文件对象的接口对象
     * @return 导出的文件对象的接口对象
     */
    protected abstract ExportFileApi factoryMethod();
}
package cn.javass.dp.factorymethod.example3;
/**
 * 具体的创建器实现对象,实现创建导出成数据库备份文件形式的对象
 */
public class ExportDBOperate extends ExportOperate{
    protected ExportFileApi factoryMethod() {
        //创建导出成数据库备份文件形式的对象
        return new ExportDB();
    }
}
package cn.javass.dp.factorymethod.example3;
/**
 * 具体的创建器实现对象,实现创建导出成文本文件格式的对象
 */
public class ExportTxtFileOperate extends ExportOperate{

    protected ExportFileApi factoryMethod() {
        //创建导出成文本文件格式的对象
        return new ExportTxtFile();
    }

}

客户端的使用:
package cn.javass.dp.factorymethod.example3;

public class Client {
    public static void main(String[] args) {
        //创建需要使用的Creator对象
        ExportOperate operate = new ExportTxtFileOperate ();
        //调用输出数据的功能方法
        operate.export("测试数据");
    }
}


 站在客户端的角度来考虑,客户端需要使用Txt导出文件直接和工厂打交道new ExportTxtFileOperate ();,如果和db数据打交道,直接new ExportDBOperate  ();

 设计模式--工厂模式