1. 概述
1.1 角色
AbstractFactory(抽象工厂):它声明了一组用于创建产品的方法,每一个方法对应一种产品。 ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。 AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。 ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
1.2 类图
«interface»
ProductA
ProductA1
ProductA2
«interface»
ProductB
ProductB1
ProductB2
Client
«interface»
AbstractFactory
+CreateProductA() : ProductA
+CreateProductB() : ProductB
ConcreteFactory1
+CreateProductA() : ProductA
+CreateProductB() : ProductB
ConcreteFactory2
+CreateProductA() : ProductA
+CreateProductB() : ProductB
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 string Weight 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 string Weight 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 string Height 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 string Height 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 类图
«interface»
ProductA
+SetName(name string)
+SetWeight(weight int64)
+Get()
ProductA1
-Name string
-Weight int64
+SetName(name string)
+SetWeight(weight int64)
+Get()
ProductA2
-String Name
-Int64 Weight
+SetName(name string)
+SetWeight(weight int64)
+Get()
«interface»
ProductB
+SetName(name string)
+SetHeight(height int64)
+Get()
ProductB1
-String Name
-Int64 Height
+SetName(name string)
+SetHeight(height int64)
+Get()
ProductB2
-String Name
-Int64 Height
+SetName(name string)
+SetHeight(height int64)
+Get()
Client
«interface»
AbstractFactory
+SetProductA(name string, weight int64) : AbstractProductA
+SetProductB(name string, height int64) : AbstractProductB
ConcreteFactory1
+SetProductA(name string, weight int64) : AbstractProductA
+SetProductB(name string, height int64) : AbstractProductB
ConcreteFactory2
+SetProductA(name string, weight int64) : AbstractProductA
+SetProductB(name string, height int64) : AbstractProductB