Golang设计模式之抽象工厂模式

ShawnLee_123 · · 997 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

抽象工厂模式

GitHub代码链接

抽象工厂模式(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{}
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:ShawnLee_123

查看原文:Golang设计模式之抽象工厂模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

997 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传