简单工厂(Simple Factory)

简单工厂(Simple Factory)

在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。

说明:

简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。

这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么所有的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。

简单工厂模式中,一个工厂类处于对产品类实例化的中心位置上,它知道每一个产品,它决定哪一个产品类应当被实例化。这个模式的优点是允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无须修改客户端,即在某种程度上支持"开-闭"原则。这个模式的缺点是对"开-闭"原则的支持不够,因为如果有新的产品加入到系统中,则需要修改工厂类,将必要的逻辑加入到工厂类中。

案例:

抽象产品

java 复制代码
 * 奖品
 */
public interface Prize {
    boolean sendGoods(String id, String count);

}

产品Phone:

java 复制代码
@Slf4j
public class Phone implements Prize{
    @Override
    public boolean sendGoods(String id, String count) {
        log.info("发送手机开始 , id: {}, count: {}", id, count);
        long startTime = System.currentTimeMillis();

        log.info("发送手机结束 , 耗时: {}", System.currentTimeMillis() - startTime);
        return false;
    }
}

产品优惠券

java 复制代码
@Slf4j
public class Coupon implements Prize {

    @Override
    public boolean sendGoods(String id, String count) {
        log.info("发送优惠券开始 , id: {}, count: {}", id, count);
        long startTime = System.currentTimeMillis();

        log.info("发送优惠券结束 , 耗时: {}", System.currentTimeMillis() - startTime);
        return false;
    }
}

产品自行车

java 复制代码
@Slf4j
public class Bicycle implements Prize{
    @Override
    public boolean sendGoods(String id, String count) {
        log.info("发送自行车开始 , id: {}, count: {}", id, count);
        long startTime = System.currentTimeMillis();

        log.info("发送自行车结束 , 耗时: {}", System.currentTimeMillis() - startTime);
        return false;
    }
}

工厂

java 复制代码
public enum PrizeTypeEnum {
    PHONE,
    BICYCLE,
    COUPON;
}

public class PrizeFactory {

    // 生成奖品对象
    public static Prize getPrize(PrizeTypeEnum prizeTypeEnum) {
        if (Objects.isNull(prizeTypeEnum))
            return null;
        if (prizeTypeEnum.equals(PrizeTypeEnum.COUPON))
            return new Coupon();
        if (prizeTypeEnum.equals(PrizeTypeEnum.PHONE))
            return new Phone();
        if (prizeTypeEnum.equals(PrizeTypeEnum.BICYCLE))
            return new Bicycle();
        throw new RuntimeException("不存在的奖品类型");
    }

    public static void main(String[] args) {
        Prize prize = PrizeFactory.getPrize(PrizeTypeEnum.BICYCLE);
        prize.sendGoods("1","1"); 
    }

}
相关推荐
C++ 老炮儿的技术栈14 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程15 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力15 小时前
从0开始配置Perforce4环境
开发语言
幸运小圣16 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风11117 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪17 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
君顾118 小时前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管
传奇开心果编程19 小时前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust
泡泡鱼(敲代码中)19 小时前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
Tairitsu_H20 小时前
[C++] 拷贝构造还是赋值重载?类默认成员函数细节详解
开发语言·c++·类和对象