工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

简单工厂模式

简单工厂模式是指由一个工厂对象决定创建哪一种产品实例。
简单工厂模式适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建项目不需要关心。

缺点

工厂类的职责相对过重,不易于扩展过于复杂的产品结构。

type Courser interface {
    Record()
}

type JavaCourse struct {}

func (course JavaCourse) Record() {
    fmt.Println("录制 Java 课程")
}

type PythonCourse struct {}

func (course PythonCourse) Record() {
    fmt.Println("录制 Python 课程")
}

创建工厂类

type CourseFactory struct {}

func (factory CourseFactory) CourseFactory(course string) Courser {
    if course == "Java" {
        return JavaCourse{}
    } else if course == "Python" {
        return PythonCourse{}
    }
}

工厂模式

工厂方法模式是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法模式让类的实例化推迟到子类中进行。
工厂方法模式中用户只需要关心所需产品对应的工厂,无需关心创建细节,而且加入新的产品时符合开闭原则。

type CourseFactory interface {
    create() Courser
}
type JavaCourseFactory struct {}

func (JavaCourseFactory) create() Courser {
    return JavaCourse{}
}

type PythonCourseFactory struct {}

func (PythonCourseFactory) create() Courser {
    return PythonCourse{}
}

工厂方法模式适用于以下场景:

  • 创建对象需要大量重复的代码。
  • 应用层不依赖于产品类实例如何被创建。如何被实现等细节。
  • 一个类通过其子类来指定创建哪一个对象。

工厂方法模式也有缺点:

  • 类的个数容易过多,增加复杂度。
  • 增加了系统的抽象性和理解难度。

抽象工厂模式

抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口,无需指定它们的具体类。应用层不依赖与产品类实例如何创建、如何被实现等细节,强调的是一系列相关的产品对象一起使用创建对象需要大量重复代码。需要提供一个产品类的库,所有的产品以同样的接口出现,从而使应用层不依赖于具体实现。