工厂模式(Factory Design Pattern)

工厂模式属于创建型的设计模式,它提供了一种创建对象的创建方式。

简单工厂

Go语言是没有构造函数的,一般会采用 NewXXX 的方式来创建对象或接口。当返回接口的时候,就是简单工厂模式。

比如说有一个汽车代工厂,它可以为各个品牌生产汽车:

package factory

type Car interface {
    Drive() string
}

type BMW struct{}
func (c BMW) Drive() string {
    return "BMW"
}

type Cadillac struct{}
func (c Cadillac) Drive() string {
    return "Cadillac"
}

type Geely struct {}
func (c Geely) Drive() string {
    return "Geely"
}

type CarFactory struct{}

func (c CarFactory) New(name string) Car {
    switch name {
    case "bmw":
        return &BMW{}
    case "cadillac":
        return &Cadillac{}
    case "geely":
        return &Geely{}
    default:
        return nil
    }
}

抽象工厂

抽象工厂模式(Abstract Factory Pattern)是由一个超级工厂创建其它的工厂,也可以称它为工厂的工厂。抽象工厂模式中的接口注意负责创建一个对象的工厂。

简单工厂模式和抽象工厂模式最大的区别其实就是:简单工厂模式是生产单个同类型的不同产品,例如戴尔电脑,苹果电脑。而抽象工厂模式生产的是多个不同类型的不同产品,所以必须将共同点抽象出来,例如戴尔CPU,苹果CPU,抽象的接口就是CPU。戴尔GPU,苹果GPU,抽象的接口就是GPU。这也是为了遵守面向对象的原则之一,面向接口编程而不是内容编程。

package factory

import (
    "fmt"
)

//计算机抽象工厂
type ComputerFactory interface {
    CreateCPU() CPU
    CreateGPU() GPU
}

//CPU抽象
type CPU interface {
    Compute()
}

//GPU抽象
type GPU interface {
    Display()
}

//Intel CPU
type IntelCPU struct{}

func (i IntelCPU) Compute() {
    fmt.Println("Intel CPU Compute")
}

//Intel GPU
type IntelGPU struct{}

func (i IntelGPU) Display() {
    fmt.Println("Intel GPU Display")
}

//AMD CPU
type AMDCPU struct{}

func (a AMDCPU) Compute() {
    fmt.Println("AMD CPU Compute")
}

//NVidia GPU
type NVidiaGPU struct{}

func (n NVidiaGPU) Display() {
    fmt.Println("NVidia GPU Display")
}

//苹果工厂
type AppleFactory struct{}

func (a AppleFactory) CreateCPU() CPU {
    return &IntelCPU{}
}

func (a AppleFactory) CreateGPU() GPU {
    return &NVidiaGPU{}
}

//华为工厂
type HuaweiFactory struct{}

func (m HuaweiFactory) CreateCPU() CPU {
    return &AMDCPU{}
}
func (m HuaweiFactory) CreateGPU() GPU {
    return &NVidiaGPU{}
}

调用:

var huawei HuaweiFactory
huawei.CreateCPU().Compute()
huawei.CreateGPU().Display()

var apple AppleFactory
apple.CreateCPU().Compute()
apple.CreateGPU().Display()

results matching ""

    No results matching ""