简介
之前介绍 工厂模式 ,抽象工厂模式更加抽象一点。
抽象工厂模式是一种创建型设计模式,提供一种接口,用于创建相关或依赖对象的家族,而不需要指定它们的具体类,抽象工厂模式通过引入抽象工厂和具体工厂的概念,以及抽象产品和具体产品的概念,使得系统可以支持多个产品族的创建。
还是去买车,工厂模式需要你自己输入车名,但是抽象工厂模式就不需要,你只需要选择具体的车就好了。
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),堵车最厉害的品牌"
}
// CarFactory 汽车工厂类,把所有的汽车全部在这里实现
type CarFactory interface {
CreateBenz() Car
CreateBMW() Car
CreateMazda() Car
}
// simpleCarFactory 具体工厂的实现,用于创建产品族的产品
type simpleCarFactory struct {
}
func NewFactory() simpleCarFactory {
return simpleCarFactory{}
}
func (s *simpleCarFactory) CreateBenz() Car {
return &Benz{}
}
func (s *simpleCarFactory) CreateBMW() Car {
return &BMW{}
}
func (s *simpleCarFactory) CreateMazda() Car {
return &Mazda{}
}
测试:
func TestNewCar(t *testing.T) {
factory := NewFactory()
car := factory.CreateMazda()
fmt.Println(car.message())
}
我需要什么汽车,直接创建汽车,而不是输入汽车的名称去创建,这就防止了创建我没有对应过的汽车。
作用和场景
和普通的工厂模式最明显的区别就是,避免了创建不存在的产品,更加的安全。
所以抽象工厂模式更加适用于创建一系列相关或依赖的对象,而无需指定它们的具体类。该模式有助于实现系统的灵活性、可扩展性和可维护性,并支持多个产品族的创建。
支持多个产品族的创建
抽象工厂模式允许客户端使用一个抽象的工厂接口来创建一整个产品族,而不是单一的产品。这有助于确保相关的产品能够一起使用,同时提供了更高层次的抽象。
遵循开闭原则
这个没啥好说的,增加新的产品族只需要实现新的具体工厂和产品类,而不需要修改已有代码。
强调一致性,避免产品族不匹配
抽象工厂模式适用于强调一致性和避免产品族不匹配的场景。通过使用同一个工厂创建的产品,可以确保这些产品是相互匹配的。
比较适用于系统需要支持多个相关的产品族,当一个系统需要创建一组相关的产品,而这些产品之间存在某种关联关系,抽象工厂模式就是一个合适的选择。例如,GUI 框架中创建按钮、窗口和滚动条等组件,这些组件需要相互关联。
总的来说,抽象工厂模式适用于需要创建一组相关或依赖的对象,同时保持一致性和可扩展性的场景。在设计系统时,如果存在多个产品族,且希望系统能够轻松适应新的产品族,抽象工厂模式是一个值得考虑的设计模式。