• 设计模式--工厂模式


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

    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  ();

     

  • 相关阅读:
    notepad++的下载与安装
    Redis和RedisDesktopManager的下载与安装
    Jdk的下载与安装
    JavaBean中对象的复制:BeanUtils和Dozer
    JAXB:java对象和xml之间转换
    mysql存储过程
    mysql索引优化
    索引优化案例
    存储优化:MyISAM和Innodb区别
    索引优化:如何避免索引失效?
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/7259687.html
Copyright © 2020-2023  润新知