每天进步一点点-工厂模式

工厂模式

什么是工厂模式?

工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

这种设计模式也是 Java 开发中最常见的一种模式,它的主要意图是定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

为什么要用工厂模式?

为了提供代码结构的扩展性,屏蔽每一个功能类中的具体实现逻辑。让外部可以更加简单的只是知道调用即可,同时,这也是去掉众多ifelse的方式。当然这可能也有一些缺点,比如需要实现的类非常多,如何去维护,怎样减低开发成本。

怎么实现?

模拟调用大模型进行实现。

如今很多厂商提供大模型API接口的调用,我们在应用当中,不一定只使用一种API,可以选择多种API的实现。

1.普通实现

一个API由一个service实现,再通过业务层进行代码上的逻辑调用。

public class QianWenService {
    public String sendMessage() {
        return "你好,我是通义千问";
    }
}
public class WenxinService {
    public String sendMessage() {
        return "你好,我是文心一言";
    }
}

接口调用

public class ModelInvokeController {
    public String sendMessage(String modelType) {
        if ("wenxin".equals(modelType)) {
            WenxinService wenxinService = new WenxinService();
            return wenxinService.sendMessage();
        } else if ("qianwen".equals(modelType)) {
            QianWenService qianWenService = new QianWenService();
            return qianWenService.sendMessage();
        }
        return "";
    }
}

测试

@Test
public void test_01() {
    ModelInvokeController modelInvokeController = new ModelInvokeController();
    String s = modelInvokeController.sendMessage("qianwen");
    System.out.println(s);
}
​

这样确实实现了业务,但如果新增需求,if else还会增加,不容易迭代拓展。

2.工厂模式实现

工程结构

定义通用接口

public interface IModelInvoke {
    public String sendMessage();
}

实现类

public class QianWenModelService implements IModelInvoke {
    private QianWenService qianWenService = new QianWenService();
    @Override
    public String sendMessage() {
        return qianWenService.sendMessage();
    }
}
​
public class WenxinModelService implements IModelInvoke {
    private WenxinService wenxinService = new WenxinService();
    @Override
    public String sendMessage() {
        return wenxinService.sendMessage();
    }
}

定义工厂

public class ModelFactory {
    public IModelInvoke getModelService(String modelType) {
        if ("wenxin".equals(modelType)) {
            return new WenxinModelService();
        } else if ("qianwen".equals(modelType)) {
            return new QianWenModelService();
        }
        return null;
    }
}

从工厂类可以看到,代码非常干净,只需创建对应的实体对象就行。如果添加其他API,在这里新增即可。

接口

public class ModelInvokeController {
    public String sendMessage(String modelType) {
        if ("wenxin".equals(modelType)) {
            WenxinService wenxinService = new WenxinService();
            return wenxinService.sendMessage();
        } else if ("qianwen".equals(modelType)) {
            QianWenService qianWenService = new QianWenService();
            return qianWenService.sendMessage();
        }
        return "";
    }
​
    public String sendMessage2(String modelType) {
        ModelFactory modelFactory = new ModelFactory();
        IModelInvoke wenxin = modelFactory.getModelService("wenxin");
        String s = wenxin.sendMessage();
        System.out.println(s);
        return "";
    }
}

测试

@Test
    public void test_02() {
        ModelInvokeController modelInvokeController = new ModelInvokeController();
        String s = modelInvokeController.sendMessage2("wenxin");
        System.out.println(s);
    }

对于调用者来说,不用关心具体的实现。

总结

优点:避免创建者与具体的产品逻辑耦合满足单一职责,每一个业务逻辑实现都在所属自己的类中完成满足开闭原则,无需更改使用调用方就可以在程序中引入新的产品类型。

问题:如果有多个模型,则实现子类会非常多。

参考来源:小傅哥-小傅哥 bugstack 虫洞栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值