研磨设计模式day06工厂方法模式

本文介绍了工厂方法模式的概念,包括其定义、结构、如何通过代码实现,以及导出文件接口的使用。讨论了模式的优点(如加快开发速度和灵活性)和存在的问题(如统一接口需求),并强调了依赖倒置原则的应用。
摘要由CSDN通过智能技术生成

目录

场景问题

名词解释 

框架是什么?

框架能干什么?

存在的问题

代码示例

工厂方法模式的定义

工厂方法模式结构图

工厂方法模式的优缺点

何时选用

设计原则提现


场景问题

名词解释 

框架是什么?

能完成一定功能的半成品软件

框架能干什么?

1.能完成一定功能,加快应用开发进度

2.给我们一个精良的程序架构

存在的问题

不管用户选择社么样的导出格式,最后导出的都是一个文件,而且系统并不知道究竟要导出成为什么样的文件,因此应该有一个统一的接口来描述系统最后生成的对象,并操作输出的文件。

代码示例

导出文件接口

package day04单例模式.day05工厂方法模式;

/**
 * 导出文件接口
 */
public interface ExportFileApi {
    /**
     * 导出内容成为文件
     * @param data  需要保存的数据
     * @return 是否导出成功
     */
    public boolean export(String data);
}

但是此时我们不知道应该怎么实现这个接口的Impl,因为我们不清楚文件格式对象是什么样子的。

系统也不知道你要选择什么样的具体实现,那我让你用户自己选择。

工厂方法模式的定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。

工厂方法模式结构图

通过代码来看

Product就是接口,一个公共的export接口

package day05工厂方法模式;

/**
 * 导出文件接口   Product
 */
public interface ExportFileApi {
    /**
     * 导出内容成为文件
     * @param data  需要保存的数据
     * @return 是否导出成功
     */
    public boolean export(String data);
}

ConcreteProduct就是Product的实现类,我这里定义了两个

package day05工厂方法模式;

/**
 * 导出成数据库备份文件形式的对象  ConcreteProduct
 */
public class ExportDB implements ExportFileApi{
    @Override
    public boolean export(String data) {
        System.out.println("导出数据"+data+"到数据库备份文件");
        return true;
    }
}
package day05工厂方法模式;

/**
 * 导出成文本文件格式的对象     ConcreteProduct
 */
public class ExportTxtFile implements ExportFileApi{
    @Override
    public boolean export(String data) {
        System.out.println("导出数据"+data+"到文本文件");
        return true;
    }
}

Creator创建器:首先他是一个抽象类,包含一个返回值为Product(也就是接口的方法,我们叫做工厂方法,也是一个抽象方法),还有一个公共的方法,也就是调用Product(接口里面的方法,一般是共有的,只是实现类不一样)

package day05工厂方法模式.factory;

import day05工厂方法模式.ExportFileApi;

/**
 * 实现导出数据的业务功能对象    Creator
 */
public abstract class ExportOperate {
    /**
     * 工厂方法,创建导出的文件对象的接口对象(抽象方法)
     * @return
     */
    protected abstract ExportFileApi factoryMethod();

    /**
     * 导出文件
     * @param data  需要保存的数据
     * @return  是否成功导出文件
     */
    public boolean export(String data){
        // 使用工厂方法
        ExportFileApi api = factoryMethod();
        return api.export(data);
    }
}

ConcreteCreator:具体的创建器对象,也就是对Creator这个抽象类的继承,并覆盖抽象方法,在抽象方法里面,定义你想选择的具体实现对象,也就是ConcreteProduct。返回值就是具体的Product实例。我这里还是定义了两个

package day05工厂方法模式.factory;

import day05工厂方法模式.ExportDB;
import day05工厂方法模式.ExportFileApi;

/**
 * 具体的创建器实现对象,实现创建导出成数据库备份文件格式的对象       ConcreteCreator
 */
public class ExportDBOperate extends ExportOperate{
    @Override
    protected ExportFileApi factoryMethod() {
        /**
         * 创建导出成数据库备份文件格式的对象
         */
        return new ExportDB();
    }
}
package day05工厂方法模式.factory;

import day05工厂方法模式.ExportFileApi;
import day05工厂方法模式.ExportTxtFile;

/**
 * 具体的创建器实现对象,实现创建导出成文本文件格式的对象      ConcreteCreator
 */
public class ExportTxtFileOperate extends ExportOperate{
    @Override
    protected ExportFileApi factoryMethod() {
        /**
         * 创建导出成文本文件格式的对象
         */
        return new ExportTxtFile();
    }
}

Client

 

工厂方法模式的优缺点

何时选用

设计原则提现

依赖倒置 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值