工厂模式(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()