1. 概述
1.1 角色
- AbstractFactory(抽象工厂):它声明了一组用于创建产品的方法,每一个方法对应一种产品。
- ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
- AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
- ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
1.2 类图
2. 代码示例
2.1 设计
- 定义
抽象产品A
- 定义
具体产品A-1
- 它有
Name
、Weight
两个成员 - 它的
SetName()
、SetWeight()
两个方法分别负责设置以上两个成员 - 它的
Get()
方法获取它本身的信息
- 定义
具体产品A-2
- 它有
Name
、Weight
两个成员 - 它的
SetName()
、SetWeight()
两个方法分别负责设置以上两个成员 - 它的
Get()
方法获取它本身的信息
- 定义
抽象产品B
- 定义
具体产品B-1
- 它有
Name
、Height
两个成员 - 它的
SetName()
、SetHeight()
两个方法分别负责设置以上两个成员 - 它的
Get()
方法获取它本身的信息
- 定义
具体产品B-2
- 它有
Name
、Height
两个成员 - 它的
SetName()
、SetHeight()
两个方法分别负责设置以上两个成员 - 它的
Get()
方法获取它本身的信息
- 定义
抽象工厂
- 定义
具体工厂1
- 它的方法
SetProductA()
设置具体产品A-1
- 它的方法
SetProductB()
设置具体产品B-1
- 定义
具体工厂2
- 它的方法
SetProductA()
设置具体产品A-2
- 它的方法
SetProductB()
设置具体产品B-2
- 定义一个函数
CreateFactory()
,用来创建具体工厂 - 调用
- 用
CreateFactory()
函数实例化 具体工厂1
——factory1
- 用
factory1
实例化产品A-1
和产品B-1
,并查看结果 - 用
CreateFactory()
函数实例化 具体工厂2
——factory2
- 用
factory2
实例化产品A-2
和产品B-2
,并查看结果
2.2 代码
package mainimport "fmt"
type AbstractProductA interface {SetName(name string)SetWeight(weight int64)Get()
}
type ConcreteProductA1 struct {Name stringWeight int64
}func (c *ConcreteProductA1) SetName(name string) {c.Name = name
}func (c *ConcreteProductA1) SetWeight(weight int64) {c.Weight = weight
}func (c *ConcreteProductA1) Get() {fmt.Printf("%v\n", c)
}
type ConcreteProductA2 struct {Name stringWeight int64
}func (c *ConcreteProductA2) SetName(name string) {c.Name = name
}func (c *ConcreteProductA2) SetWeight(weight int64) {c.Weight = weight
}
func (c *ConcreteProductA2) Get() {fmt.Printf("%v\n", c)
}
type AbstractProductB interface {SetName(name string)SetHeight(height int64)Get()
}
type ConcreteProductB1 struct {Name stringHeight int64
}func (c *ConcreteProductB1) SetName(name string) {c.Name = name
}func (c *ConcreteProductB1) SetHeight(height int64) {c.Height = height
}
func (c *ConcreteProductB1) Get() {fmt.Printf("%v\n", c)
}
type ConcreteProductB2 struct {Name stringHeight int64
}func (c *ConcreteProductB2) SetName(name string) {c.Name = name
}func (c *ConcreteProductB2) SetHeight(height int64) {c.Height = height
}
func (c *ConcreteProductB2) Get() {fmt.Printf("%v\n", c)
}
type Factory interface {SetProductA(name string, weight int64) AbstractProductASetProductB(name string, height int64) AbstractProductB
}
type Factory1 struct {
}func (f *Factory1) SetProductA(name string, weight int64) AbstractProductA {a := &ConcreteProductA1{}a.SetName(name)a.SetWeight(weight)return a
}func (f *Factory1) SetProductB(name string, height int64) AbstractProductB {a := &ConcreteProductB1{}a.SetName(name)a.SetHeight(height)return a
}
type Factory2 struct {
}func (f *Factory2) SetProductA(name string, weight int64) AbstractProductA {a := &ConcreteProductA2{}a.SetName(name)a.SetWeight(weight)return a
}func (f *Factory2) SetProductB(name string, height int64) AbstractProductB {a := &ConcreteProductB2{}a.SetName(name)a.SetHeight(height)return a
}
func CreateFactory(pType int64) Factory {switch pType {case 1:return &Factory1{}case 2:return &Factory2{}}return nil
}func main() {factory1 := CreateFactory(1)factory1.SetProductA("A1", 3).Get()factory1.SetProductB("B1", 3).Get()factory2 := CreateFactory(2)factory2.SetProductA("A2", 4).Get()factory2.SetProductB("B2", 4).Get()
}
&{A1 3}
&{B1 3}
&{A2 4}
&{B2 4}
2.3 类图