找回密码
 立即注册
首页 业界区 业界 [设计模式]创建型-简单工厂模式

[设计模式]创建型-简单工厂模式

山芷兰 2025-6-9 08:34:50
简介

简单工厂模式又称为静态工厂模式,属于创建型模式,但不属于GOF23设计模式。由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。
简单工厂适用场景:工厂类负责创建的对象比较少;客户端只需要知道传入工厂类的参数,对于如何创建对象的逻辑并不关心。
简单工厂优缺点:

  • 优点:只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其细节创建。
  • 缺点:工厂类的职责相对过重,增加新的产品,需要修改工厂类的判断逻辑,违背了开闭原则。
示例代码

Go

go语言没有构造函数,所以一般会定义NewXXX函数来初始化相关类。NewXXX函数返回接口时就是简单工厂模式,也就是说Go的一般推荐做法就是简单工厂,
simplefactory/demo.go
  1. package simplefactory
  2. import "fmt"
  3. type API interface {
  4.         Say(name string) string
  5. }
  6. func NewAPI(t int) API {
  7.         if t == 1 {
  8.                 return &hiAPI{}
  9.         } else if t == 2 {
  10.                 return &helloAPI{}
  11.         }
  12.         return nil
  13. }
  14. type hiAPI struct{}
  15. func (*hiAPI) Say(name string) string {
  16.         return fmt.Sprintf("hi, %s", name)
  17. }
  18. type helloAPI struct {}
  19. func (*helloAPI) Say(name string) string {
  20.         return fmt.Sprintf("hello, %s", name)
  21. }
复制代码
单元测试:simplefactory/demo_test.go
  1. package simplefactory
  2. import (
  3.         "testing"
  4. )
  5. func TestType1(t *testing.T) {
  6.         api := NewAPI(1)
  7.         s := api.Say("zhangsan")
  8.         if s != "hi, zhangsan" {
  9.                 t.Error("test failed")
  10.         }
  11. }
  12. func TestType2(t *testing.T) {
  13.         api := NewAPI(2)
  14.         s := api.Say("zhangsan")
  15.         if s != "hello, zhangsan" {
  16.                 t.Error("test failed")
  17.         }
  18. }
复制代码
主方法调用 main.go
  1. package main
  2. import (
  3.         "fmt"
  4.         "tmpgo/simplefactory"
  5. )
  6. func main() {
  7.         api := simplefactory.NewAPI(1)
  8.         fmt.Println(api.Say("zhangsan"))
  9. }
复制代码
Python
  1. class GreetAPI:
  2.     def Say(self, name):
  3.         pass
  4. class HiAPI(GreetAPI):
  5.     def Say(self, name):
  6.         return f"Hi, {name}"
  7.    
  8. class helloAPI(GreetAPI):
  9.     def Say(self, name):
  10.         return f"Hello, {name}"
  11.    
  12. def NewGreetAPI(t: int):
  13.     if t == 1:
  14.         return HiAPI()
  15.     elif t == 2:
  16.         return helloAPI()
  17.     else:
  18.         raise Exception(f"Unknown type: {t}")
  19. if __name__ == "__main__":
  20.     api = NewGreetAPI(2)
  21.     print(api.Say("zhangsan"))
复制代码
参考


  • 博客园 - kasamino - 设计模式之工厂模式

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册