农民 发表于 2025-1-21 16:10:43

Golang学习条记_28——工厂方法模式

Golang学习条记_25——协程
Golang学习条记_26——通道
Golang学习条记_27——单例模式


工厂方法模式

1. 介绍

工厂方法模式(Factory Method)是一种创建型设计模式,它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让类的实例化推迟到子类中进行
2. 优点


[*] 解耦:将对象的创建与使用分离,客户端不必要知道具体的类名。
[*] 扩展性:增加新的产物类时,只需添加相应的工厂类即可,符合开闭原则。
[*] 单一职责原则:将创建对象的代码封装在工厂中,职责单一。
3. 类图


[*] Product(产物接口):界说了产物的接口,所有具体产物都要实现这个接口。
[*] ConcreteProduct(具体产物):实现了Product接口的具体类。
[*] Creator(工厂接口):声明了工厂方法,用于返回一个Product对象。
[*] ConcreteCreator(具体工厂):实现了工厂接口,返回具体产物的实例。
    +-----------------+
    |   Product   |<----------------+
    +-----------------+               |
    | + Use()         |               |
    +-----------------+               |
            ^                           |
            |                           |
    +-----------------+         +-----------------+
    | ConcreteProductA|         | ConcreteProductB|
    +-----------------+         +-----------------+
    | + Use()         |         | + Use()         |
    +-----------------+         +-----------------+

    +-----------------+
    |   Creator   |<----------------+
    +-----------------+               |
    | + CreateProduct()|                |
    +-----------------+               |
            ^                           |
            |                           |
    +-----------------+         +-----------------+
    | ConcreteCreatorA|         | ConcreteCreatorB|
    +-----------------+         +-----------------+
    | + CreateProduct()|      | + CreateProduct()|
    +-----------------+         +-----------------+
4. 实现

// Product 是产品接口
type Product interface {
        Use() string
}

// ConcreteProductA 是具体产品A
type ConcreteProductA struct{}

func (p *ConcreteProductA) Use() string {
        return "使用产品A"
}

// ConcreteProductB 是具体产品B
type ConcreteProductB struct{}

func (p *ConcreteProductB) Use() string {
        return "使用产品B"
}

// Factory 是工厂接口
type Factory interface {
        CreateProduct() Product
}

// ConcreteFactoryA 是具体工厂A
type ConcreteFactoryA struct{}

func (f *ConcreteFactoryA) CreateProduct() Product {
        return &ConcreteProductA{}
}

// ConcreteFactoryB 是具体工厂B
type ConcreteFactoryB struct{}

func (f *ConcreteFactoryB) CreateProduct() Product {
        return &ConcreteProductB{}
}
源码

// Product 是产品接口
type Product interface {
        Use() string
}

// ConcreteProductA 是具体产品A
type ConcreteProductA struct{}

func (p *ConcreteProductA) Use() string {
        return "使用产品A"
}

// ConcreteProductB 是具体产品B
type ConcreteProductB struct{}

func (p *ConcreteProductB) Use() string {
        return "使用产品B"
}

// Factory 是工厂接口
type Factory interface {
        CreateProduct() Product
}

// ConcreteFactoryA 是具体工厂A
type ConcreteFactoryA struct{}

func (f *ConcreteFactoryA) CreateProduct() Product {
        return &ConcreteProductA{}
}

// ConcreteFactoryB 是具体工厂B
type ConcreteFactoryB struct{}

func (f *ConcreteFactoryB) CreateProduct() Product {
        return &ConcreteProductB{}
}
func test() {        // 创建具体工厂A        factoryA := &ConcreteFactoryA{}        // 使用工厂A创建产物A        productA := factoryA.CreateProduct()        // 使用产物A        println(productA.Use())        // 创建具体工厂B        factoryB := &ConcreteFactoryB{}        // 使用工厂B创建产物B        productB := factoryB.CreateProduct()        // 使用产物B        println(productB.Use())}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Golang学习条记_28——工厂方法模式