设计模式--工厂模式

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

复制代码
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  ();
复制代码

 

 

posted on   luzhouxiaoshuai  阅读(149)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示