抽象工厂模式
抽象工厂模式(Abstra Factory Pattern)是围绕一个超级工厂,创建其他的工厂。这种类型的设计模式属于创建型模式。
抽象工厂解决的问题
在工厂模式中,一个具体的工厂对应一种具体的产品。但是,有时候我们需要工厂可以提供多个产品对象,而不是单一产品对象。
我们首先要理解两个概念
- 产品等级结构 产品的等级结构就是产品的继承结构,如一个模型工厂,可以画出圆形,长方形和正方形的模型。这里抽象的模型工厂和具体的模型构成了产品等级结构。
- 产品族 在抽象工厂模式中,产品族指的是同一个工厂生产的,位于不同产品等级结构的一组产品。如模具厂生产的红色圆形模具,圆形模型属于模型产品等级结构中,红色属于颜料产品等级结构中。
例如我们的衣服,上衣由一个工厂生产,有卫衣,有衬衫,有西服。裤子由一个工厂生产,有短裤,有休闲裤,有西裤。这样,不同的上衣和不同的裤子组合起来,就是成了一套衣服,
就像QQ秀一样,当你在商城买了一套衣服裤子的时候,就是由这个抽象工厂所生产的。抽象工厂从几个具体的工厂中获取衣服,裤子,帽子等。组合成一套进行成套的售卖。
优点
当一个产品族中多个对象被设计成一起工作时,它可以保证客户始终只使用同一个产品族中的对象
缺点
产品族拓展非常困难,需要修改很多代码
抽象工厂实现
1.1 设计接口
设计一个模型接口和色彩接口
//Shape 模型接口
type Shape interface {
Draw()
}
//Color 色彩接口
type Color interface {
Fill()
}
1.2 实现模型类
//Circle 实现模型接口的圆形类
type Circle struct{}
//Square 实现模型接口的正方形类
type Square struct{}
//Draw Circle类的Draw方法
func (c Circle) Draw() {
fmt.Println("Circle Draw() method")
}
//Draw Square类的Draw方法
func (s Square) Draw() {
fmt.Println("Square Draw() method")
}
1.3 实现色彩类
//Red 实现色彩接口的红色类
type Red struct{}
//Green 实现色彩接口的绿色类
type Green struct{}
//Fill 红色类的Fill方法
func (r Red) Fill() {
fmt.Println("Red Fill() method")
}
//Fill 绿色类的Fill方法
func (g Green) Fill() {
fmt.Println("Green Fill() method")
}
1.4 设计抽象工厂接口
//AbstractFactory 抽象工厂接口
type AbstractFactory interface {
GetShape(shapeName string) Shape
GetColor(colorName string) Color
}
1.5 根据抽象工厂的接口实现具体工厂类
//ShapeFactory 模型工厂的类
type ShapeFactory struct{}
//ColorFactory 色彩工厂的类
type ColorFactory struct{}
//GetShape 模型工厂实例获取模型子类的方法
func (sh ShapeFactory) GetShape(shapeName string) Shape {
switch shapeName {
case "circle":
return &Circle{}
case "square":
return &Square{}
default:
return nil
}
}
//GetColor 模型工厂实例不需要色彩方法
func (sh ShapeFactory) GetColor(colorName string) Color {
return nil
}
//GetShape 色彩工厂实例不需要获取模型方法
func (cf ColorFactory) GetShape(shapeName string) Shape {
return nil
}
//GetColor 色彩工厂实例,获取具体色彩子类
func (cf ColorFactory) GetColor(colorName string) Color {
switch colorName {
case "red":
return &Red{}
case "green":
return &Green{}
default:
return nil
}
}
1.6 实现一个超级工厂
超级工厂用于获取模型工厂或者色彩工厂实例
//FactoryProducer 超级工厂类,用于获取工厂实例
type FactoryProducer struct{}
//GetFactory 获取工厂方法
func (fp FactoryProducer) GetFactory(factoryname string) AbstractFactory {
switch factoryname {
case "color":
return &ColorFactory{}
case "shape":
return &ShapeFactory{}
default:
return nil
}
}
//NewFactoryProducer 创建FactoryProducer类
func NewFactoryProducer() *FactoryProducer {
return &FactoryProducer{}
}
有疑问加站长微信联系(非本文作者)