美文网首页
设计模式-工厂模式 go语言版

设计模式-工厂模式 go语言版

作者: 叫我小码哥 | 来源:发表于2023-08-04 11:40 被阅读0次

什么是工厂模式

工厂模式(Factory Pattern)是 常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式,可以将对象的创建与使用代码分离,提供一种统一的接口来创建不同类型的对象。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
常见的工厂模式有2种简单工厂模式和抽象工厂模式

简单工厂模式

抽象产品(Abstract Product):定义了产品的共同接口或抽象类。它可以是具体产品类的父类或接口,规定了产品对象的共同方法。
具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。
抽象工厂(Abstract Factory):声明了创建产品的抽象方法,可以是接口或抽象类。它可以有多个方法用于创建不同类型的产品。
具体工厂(Concrete Factory):实现了抽象工厂接口,负责实际创建具体产品的对象。

图1
//抽象层
type Positions interface {
    Query()
}
//实现层
type Teacher struct {
}

func (t Teacher) Query() {
    fmt.Println("i am teacher")
}
type Scientist struct {
}

func (s Scientist) Query() {
    fmt.Println("i am scientist")
}
//业务逻辑层
type Factory struct {
}

func (f *Factory) NewPositionsFactory(name string) Positions {
    var positions Positions
    switch name {
    case "teacher":
        positions = new(Teacher)
    case "scientist":
        positions = new(Scientist)
    default:
        positions = nil
    }
    return positions
}
func main() {
    factory := new(Factory)
    //var factory Factory

    teacher := factory.NewPositionsFactory("teacher")
    if teacher != nil {
        teacher.Query()
    }

    scientist := factory.NewPositionsFactory("scientist")
    if scientist != nil {
        scientist.Query()
    }
}

优点:
实现创建对象和和使用的分离
不需要关注过多的业务类

缺点:
对工厂的职责过重
增加业务类的个数,复杂度增加
违反开闭原则,添加新产品修改工厂逻辑

适用:
创建对象比较少的情况,复杂度不高

抽象工厂模式

抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。


图2

业务功能抽象

type Positions interface {
    Query()
}

type AbstractPositions interface {
    CreatePositions() Positions //生产职位
}

具体产品

type Teacher struct {
}

func (t Teacher) Query() {
    fmt.Println("i am teacher")
}

type Scientist struct {
}

func (s Scientist) Query() {
    fmt.Println("i am scientist")
}

产品类工厂

//基础工厂模块
type TeacherFactory struct {
    AbstractPositions
}

func (t TeacherFactory) CreatePositions() Positions {
    var positions Positions
    positions = new(Teacher)
    return positions
}

type ScientistFactory struct {
    AbstractPositions
}

func (t Scientist) CreatePositions() Positions {
    var positions Positions
    positions = new(Scientist)
    return positions
}

测试

func main()  {
    //1. 创建工厂
    teacherFactory := new(TeacherFactory)
    //2.根据工厂生产对象,执行具体对象方法
    teacherFactory.CreatePositions().Query()
}

优点:
1.记忆点少,不记类名等
2.实现了对象的创建和使用分离
3.扩展性灵活
4.新产品接入更符合开闭原则
缺点:
1.复杂度相对简单工厂较高

相关文章

  • Go语言设计模式(2)工厂模式

    Go语言设计模式(2)工厂模式 工厂模式的定义 工厂模式的定义如下: Define an interface fo...

  • Go语言设计模式(3)抽象工厂模式

    Go语言设计模式(3)抽象工厂模式 抽象工厂模式的定义 抽象工厂模式的定义如下: Provide an inter...

  • 设计模式四、抽象工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 抽象工厂模式 ...

  • 工厂模式

    java设计模式-工厂模式 工厂模式: 工厂模式是java设计模式里最常用的设计模式之一。 工厂模式属于创建型模式...

  • 设计模式之工厂模式

    设计模式之工厂模式 标签(空格分隔): 设计模式 工厂模式 设计模式的感念 设计模式的应用 工厂设计模式的产生 工...

  • 设计模式三、工厂模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 工厂模式 在一...

  • 设计模式一、单例模式

    系列传送门设计模式一、单例模式设计模式二、简单工厂模式设计模式三、工厂模式设计模式四、抽象工厂模式 简单单例(推荐...

  • 单件设计模式

    一、定义 设计模式 设计模式就是一种更好的编写代码方案。 常见设计模式 工厂设计模式、抽象工厂设计模式、抽象工厂设...

  • iOS设计模式(三)之抽象工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

  • iOS设计模式(一)之简单工厂模式

    设计模式系列传送门 iOS设计模式(一)之简单工厂模式iOS设计模式(二)之工厂模式iOS设计模式(三)之抽象工厂...

网友评论

      本文标题:设计模式-工厂模式 go语言版

      本文链接:https://www.haomeiwen.com/subject/ylqypdtx.html