(三)JAVA设计模式——简单工厂模式案例实现

前言

简单工厂模式是工厂模式的一种,又叫静态工厂模式。其通过专门定义一个工厂类来创建具有同一个父类的子类方法实例,通过静态方式创建子类对象实例。这里我们以发送消息为例,其类图结构如下:
简单工厂模式案例

正文

①创建一个发送消息的接口

package com.yundi.atp.dp.factory.simple;

/**
 * @Author: 北溟溟
 * @Description: 消息类接口
 * @Date: 2022/3/13 9:54
 * @Version: 1.0.0
 */
public interface IMessage {
    /**
     * 定义一个sayHello接口
     *
     * @param name :用户
     */
    void sayHello(String name);
}

②实现消息接口

微信方式实现sayHello

package com.yundi.atp.dp.factory.simple;

/**
 * @Author: 北溟溟
 * @Description:使用微信方式实现sayHello
 * @Date: 2022/3/13 9:56
 * @Version: 1.0.0
 */
public class WeChatMessage implements IMessage {
    @Override
    public void sayHello(String name) {
        System.out.println("微信方式: " + name + " say hello!");
    }
}

qq方式实现sayHello

package com.yundi.atp.dp.factory.simple;
/**
 * @Author: 北溟溟
 * @Description: qq方式实现sayHello
 * @Date: 2022/3/13 9:56
 * @Version: 1.0.0
 */
public class QqMessage implements IMessage {
    @Override
    public void sayHello(String name) {
        System.out.println("QQ方式: " + name + " say hello!");
    }
}

钉钉方式实现sayHello

package com.yundi.atp.dp.factory.simple;

/**
 * @Author: 北溟溟
 * @Description:钉钉方式实现sayHello
 * @Date: 2022/3/13 9:56
 * @Version: 1.0.0
 */
public class DingdingMessage implements IMessage {
    @Override
    public void sayHello(String name) {
        System.out.println("钉钉方式: " + name + " say hello!");
    }
}

③创建一个获取消息的工厂实例

package com.yundi.atp.dp.factory.simple;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: 北溟溟
 * @Description: 工厂类
 * @Date: 2022/3/13 10:00
 * @Version: 1.0.0
 */
public class SayHelloFactory {
    private final static Map<String, Object> map = new HashMap<>();

    /**
     * 将接口定义的实现方式存储到map中,方便获取
     */
    static {
        map.put("wechat", new WeChatMessage());
        map.put("qq", new QqMessage());
        map.put("dingding", new DingdingMessage());
    }

    /**
     * 通过类型获取工厂类实例
     * 注意:如果获取不到对应实例,要做空异常判断
     * @param type
     * @return
     */
    public static IMessage createSendMessage(String type) {
        return (IMessage) map.getOrDefault(type, null);
    }

    //通过不同类型参数获取不同子类实例
    public static void main(String[] args) {
        IMessage wechat = SayHelloFactory.createSendMessage("wechat");
        wechat.sayHello("tom");
        IMessage qq = SayHelloFactory.createSendMessage("qq");
        qq.sayHello("jim");
        IMessage dingding = SayHelloFactory.createSendMessage("dingding");
        dingding.sayHello("jackson");
    }
}

简单工厂类的优缺点及适用场景

优点

  • 简化了创建子类的过程,只关注使用,不用关注子类具体的业务逻辑
  • 便于扩展,简化了子类使用方式

缺点

  • 工厂类出现故障,导致所有子类实例业务逻辑不可使用
  • 创建或者删除子类,工厂类就要修改,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。不符合开闭原则。

适用场景

  • 创建子类对象比较固定,比较少,不会轻易变动。
  • 对于子类创建的过程不关心,只关注创建哪个子类实例对象的类型

结语

关于简单工厂模式的案例实现到这里就结束了,我们下期见。。。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厉害哥哥吖

您的支持是我创作下去的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值