简介
工厂模式:用于一个创建对象的接口,目的就是定一个用于创建对象的接口,但将实例化的过程延迟到子类中,就是由子类去决定实例化哪个对象,这样客户端代码不需要具体的实例是如何创建的,只需要使用工厂提供的接口即可获取所需要的对象。
你要去拥有一辆车,你不需要自己去造,你只需要去汽车经销商,根据车品牌名称,就可以知道车辆的信息。此时汽车经销商就是工厂。
Demo
代码如下:
type Car interface {
message() string
}
type Benz struct {
}
func (b *Benz) message() string {
return "梅赛德斯-奔驰(Mercedes-Benz)是世界闻名的德国豪华汽车品牌。"
}
type BMW struct {
}
func (b *BMW) message() string {
return "宝马(BMW),中文全称为巴伐利亚发动机制造厂股份有限公司,德国汽车品牌。"
}
type Mazda struct {
}
func (m *Mazda) message() string {
return "马自达(Mazda),堵车最厉害的品牌"
}
type Nil struct {
}
func (m *Nil) message() string {
return "找不到该品牌"
}
// NewCarFactory 具体工厂实现,用于创建具体汽车
func NewCarFactory(carName string) Car {
switch carName {
case "奔驰":
return &Benz{}
case "宝马":
return &BMW{}
case "马自达":
return &Mazda{}
default:
return &Nil{}
}
}
测试:
func TestNewCar(t *testing.T) {
message := NewCarFactory("马自达").message()
fmt.Println(message)
}
作用
一般来说,工厂方法主要用于提供一种灵活的方式来创建对象,使得客户端代码不依赖具体的对象创建过程。
可维护性
比如要修改车介绍,直接去对应的提供方修改即可
可扩展性
工厂方法模式通过引入抽象工厂和具体工厂的概念,可以支持产品族的扩展。不同的具体工厂可以创建不同的产品族,而客户端通过使用不同的具体工厂可以获取不同产品族的对象。如果要增加BYD,直接创建BYD对象实现接口即可
符合开闭原则
工厂方法模式有助于符合开闭原则,因为在增加新的产品时,只需要创建新的具体工厂和产品类,而不需要修改已有的代码。这样,系统的扩展性更好,不容易引入不必要的风险。
隐藏对象的具体类型
工厂方法模式可以隐藏对象的具体类型,使得客户端只关心产品的抽象类型。这有助于降低系统的耦合度,使得系统更容易维护和扩展。
对象和使用解耦
工厂方法模式将对象的创建委托给子类,使得客户端不再负责实例化具体的对象,从而实现了对象的创建和使用的解耦。客户端只需要知道使用工厂方法来获取所需的对象,而不需要关心具体的实现细节。
工厂方法模式常常与其他设计模式结合使用,例如和抽象工厂模式结合,以支持产品族和产品等级结构。