工厂模式
什么是工厂模式?
工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
这种设计模式也是 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 虫洞栈