设计模式--工厂方法模式(Go语言描述)

设计模式–工厂方法模式(Go语言描述)

简单工厂模式

UML


class.png

简单工厂模式中通常包含以下几种角色:

  1. Factory(工厂类) 工厂类用来生产产品,是整个简单工厂模式的核心。在简单工厂模式中,通过调用工厂类传入想要生产的产品参数,生产相应的产品。
  2. Product(抽象产品类) 抽象产品类,用来定义具体产品所应实现的接口。
  3. ConcreteProduct(具体产品类) 具体产品类,实现了抽象产品类接口,不同的具体产品,对于同一种方法可能具有不同的实现方式,经由工厂类进行实例化。
示例
package main

import (
    "fmt"
    "strings"
)

type Car interface {
    Drive()
}

type BMW struct{}

func (b *BMW) Drive() {
    fmt.Printf("Drive BMW\n")
}

type Audi struct{}

func (a *Audi) Drive() {
    fmt.Printf("Drive Auti\n")
}

func Factory(name string) Car {
    switch strings.ToLower(name) {
    case "audi":
        return &Audi{}
    case "bmw":
        return &BMW{}
    default:
        fmt.Printf("Not Support %s\n", name)
        return nil
    }
}

func main() {
    car := Factory("BMW")
    car.Drive()
    car = Factory("Audi")
    car.Drive()
}

/* 输出
Drive BMW
Drive Auti
*/
小结

简单工厂模式,减轻了客户端创建类实例时的负担,只需调用工厂类传入产品参数即可获得产品实例,无需再关心具体产品创建的逻辑和细节,简化了客户端的工作,但是在简单工厂模式中,工厂方法职责过重,如果具体产品种类太多,会造成工厂方法的业务逻辑复杂,另外,如果要新增具体产品类,则需要在工厂类中增加相应的初始化方法,违反了“开闭原则”。

工厂方法模式

UML


class.png

工厂方法模式通常包含以下几种角色:

  1. Factory(抽象工厂类): 定义了工厂接口,所有具体工厂都应该实现该接口。
  2. ConcreteFactory(具体工厂类): 细化了简单工厂模式中工厂方法过重的职责,每种工厂只负责一种具体产品的生产。
  3. Product(抽象产品类): 定义了产品的公共接口,全部具体产品都应实现本接口。
  4. ConcreteProduct(具体产品类): 实现了抽象产品接口,由具体的工厂负责生产,具体产品与具体工厂存在一一对应的关系。
示例
package main

import (
    "fmt"
)

type CarFactory interface {
    FactoryMethod() Car
}

type BMWFactory struct{}

func (f *BMWFactory) FactoryMethod() Car {
    return &BMW{}
}

type AudiFactory struct{}

func (f *AudiFactory) FactoryMethod() Car {
    return &Audi{}
}

type Car interface {
    Drive()
}

type BMW struct{}

func (b *BMW) Drive() {
    fmt.Printf("Drive BMW\n")
}

type Audi struct{}

func (a *Audi) Drive() {
    fmt.Printf("Drive Auti\n")
}

func main() {
    bmwFactory := &BMWFactory{}
    car := bmwFactory.FactoryMethod()
    car.Drive()

    audiFactory := &AudiFactory{}
    car = audiFactory.FactoryMethod()
    car.Drive()
}

/* 输出
Drive BMW
Drive Auti
*/

在上述例子中使用CarFactory接口定义了具体工厂所应具有的方法,BMWFactoryAudiFactory作为具体工厂分别生产相对应的单一具体产品BMWAudi

小结

在工厂方法模式中,通过设置具体工厂,对简单工厂模式中的负责的工厂类进行了职责的分离,在具体工厂中进行具体产品的生产更加符合”单一原则“,在新增产品时,只需要新增相应的具体工厂和具体产品即可,不再需要修改工厂类,符合”开闭原则“。
因为不同的产品对应于不同的工厂,所以系统类的个数在增加产品时将会成对增加,在一定程度上增大了系统复杂度。

本文使用CC BY-NA-SA 4.0协议许可
本文链接:http://404-notfound.com/factory/