golang实现设计模式之工厂模式总结-代码、优缺点、适用场景
工厂模式也是一种创建型模式,它与简单工厂不同的是将实例的创建推迟到具体的工厂类方法中实现,每一种产品生成一个对应的工厂,从而替换掉简单工厂方法模式中那个静态工厂方法。所以在工厂模式中,不同产品就由不同的工厂生产,每次增加产品时,我们就不需要在类似在简单工厂中,在统一的工厂类方法中修改,而是通过直接新建产品类,新建生产该产品的工厂类,通过这种模式,我们就可以解决简单工厂中的违背 OCP
的问题,对后期的代码扩展有利。
我们在应用工厂模式时,主要的结构设计包括如下:
- 1.定义产品接口,声明相关方法
- 2.定义具体产品,实现产品接口
- 3.定义工厂接口,声明工厂通用方法
- 4.定义不同产品的工厂类,实现工厂接口,工厂类和产品类往往依次对应
- 5.客户端需要生成哪种实例,就去请求对应的产品工厂生成实例
当然工厂模式也不是万能的,也有优缺点。
优缺点
- 优点:不直接在客户端创建具体产品的实例,降低了耦合性
1.不关心创建细节: 用户只需要关心所需产品对应的工厂, 无需关心创建细节;
2.符合开闭原则: 加入新产品,符合开闭原则, 提高可扩展性;
- 缺点:每增加一种产品就要相应的增加一个工厂类,类增多了。
1.增加复杂性 : 类的个数容易过多, 增加系统复杂度 ;
在添加新产品时, 除了编写新的产品类之外, 还要编写该产品类对应的工厂类 ;
2.增加难度: 增加了系统抽象性和理解难度 ;
工厂方法本身利用了抽象, 该模式中会引入抽象层, 如果要动态创建产品类, 还要引入反射技术;
适用场景
- 1.重复代码: 创建对象需要使用大量重复的代码;
- 2.不关心创建过程: 客户端不依赖产品类, 不关心实例如何被创建, 实现等细节;
- 3.创建对象: 一个类通过其子类来指定创建哪个对象。
代码实现
package main import "fmt" // 1.product interface type iProduct interface { show() } // 2.product struct type iphoneProduct struct { } func (r *iphoneProduct) show() { fmt.Println("This is iphone.") } type ipadProduct struct { } func (r *ipadProduct) show() { fmt.Println("This is ipad.") } // 3.factory interface type factory interface { produce() iProduct } // 4.concrete factory type iphoneFactory struct { } func (r *iphoneFactory) produce() iProduct { return &iphoneProduct{} } type ipadFactory struct { } func (r *ipadFactory) produce() iProduct { return &ipadProduct{} } func main() { f1 := &iphoneFactory{} f1.produce().show() f2 := &ipadFactory{} f2.produce().show() }
参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具