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]