1 概述
工廠(chǎng)方法類(lèi)定義產(chǎn)品對(duì)象創(chuàng)建接口,但由子類(lèi)實(shí)現(xiàn)具體產(chǎn)品對(duì)象的創(chuàng)建。
2.1 角色
- Product(抽象產(chǎn)品):它是具體產(chǎn)品的抽象類(lèi),可以是結(jié)構(gòu)體,也可以是接口
- ConcreteProduct(具體產(chǎn)品):它實(shí)現(xiàn)了抽象產(chǎn)品接口,對(duì)應(yīng)了一種具體產(chǎn)品
- Factroy(抽象工廠(chǎng)):在抽象工廠(chǎng)類(lèi)中聲明了工廠(chǎng)方法,用于返回一個(gè)產(chǎn)品。
- ConcreteFactory(具體工廠(chǎng)):實(shí)現(xiàn)了在抽象工廠(chǎng)中聲明的工廠(chǎng)方法,并可由客戶(hù)端調(diào)用,返回一個(gè)具體產(chǎn)品類(lèi)的實(shí)例。
2.2 類(lèi)圖

image.png
classDiagram
class Product{
<<interface>>
+Get()
}
class ConcreteProductA{
+Get()
}
class ConcreteProductB{
+Get()
}
Product <|.. ConcreteProductA
Product <|.. ConcreteProductB
class Factroy{
<<interface>>
+CreateProduct()
}
class ConcreteFactroyA{
+CreateProduct() Product
}
class ConcreteFactroyB{
+CreateProduct() Product
}
ConcreteFactroyA ..|> Factroy
ConcreteFactroyB ..|> Factroy
ConcreteProductA <.. ConcreteFactroyA
ConcreteProductB <.. ConcreteFactroyB
class Client {
}
Product <-- Client
Client --> Factroy
2 代碼示例
2. 1 設(shè)計(jì)
2.2 代碼
package main
import (
"fmt"
)
type Product interface {
Get()
}
type ConcreteProductA struct {
Name string
Kind string
}
func (c *ConcreteProductA) Get() {
fmt.Printf("%+v",c)
}
type ConcreteProductB struct {
Name string
Kind string
}
func (c *ConcreteProductB) Get() {
fmt.Printf("%+v",c)
}
type ConcreteProductC struct {
Name string
Kind string
}
func (c *ConcreteProductC) Get() {
fmt.Printf("%+v",c)
}
type Factroy interface {
CreateProduct(name string) Product
}
type ConcreteFactoryA struct {
}
func (f *ConcreteFactoryA) CreateProduct(name string) Product {
p := &ConcreteProductA{
Name: name,
Kind:"A",
}
return p
}
type ConcreteFactoryB struct {
}
func (f *ConcreteFactoryB) CreateProduct(name string) Product {
p := &ConcreteProductB{
Name: name,
Kind: "B",
}
return p
}
type ConcreteFactoryC struct {
}
func (f *ConcreteFactoryC) CreateProduct(name string) Product {
p := &ConcreteProductC{
Name: name,
Kind: "C",
}
return p
}
func CreateProduct(myType int64) Factroy {
switch myType {
case 1:
return &ConcreteFactoryA{}
case 2:
return &ConcreteFactoryB{}
case 3:
return &ConcreteFactoryC{}
}
return nil
}
func main() {
factory := CreateProduct(1)
product := factory.CreateProduct("nginx")
product.Get()
}
- 輸出
&{Name:nginx Kind:A}
2.3 類(lèi)圖

image.png
classDiagram
class Product{
<<interface>>
+Get()
}
class ConcreteProductA{
+Name:string
+Kind:string
+Get()
}
class ConcreteProductB{
+Name:string
+Kind:string
+Get()
}
class ConcreteProductC{
+Name:string
+Kind:string
+Get()
}
Product <|.. ConcreteProductA
Product <|.. ConcreteProductB
Product <|.. ConcreteProductC
class Factroy{
<<interface>>
+CreateProduct()
}
class ConcreteFactroyA{
+CreateProduct() Product
}
class ConcreteFactroyB{
+CreateProduct() Product
}
class ConcreteFactroyC{
+CreateProduct() Product
}
ConcreteFactroyA ..|> Factroy
ConcreteFactroyB ..|> Factroy
ConcreteFactroyC ..|> Factroy
ConcreteProductA <.. ConcreteFactroyA
ConcreteProductB <.. ConcreteFactroyB
ConcreteProductC <.. ConcreteFactroyC
3. 簡(jiǎn)單工廠(chǎng)
在產(chǎn)品結(jié)構(gòu)簡(jiǎn)單的情況下,我們可以把工廠(chǎng)模式簡(jiǎn)化成一個(gè)簡(jiǎn)單工廠(chǎng)
3.1 角色
- Product(抽象產(chǎn)品):它是具體產(chǎn)品的抽象類(lèi),可以是結(jié)構(gòu)體,也可以是接口
- ConcreteProduct(具體產(chǎn)品):它實(shí)現(xiàn)了抽象產(chǎn)品接口,對(duì)應(yīng)了一種具體產(chǎn)品
- Factroy(簡(jiǎn)單工廠(chǎng)):根據(jù)一個(gè)條件用于返回一個(gè)產(chǎn)品
去掉了具體工廠(chǎng)角色,產(chǎn)品由簡(jiǎn)單工廠(chǎng)直接返回。
3.2 類(lèi)圖

image.png
classDiagram
Product <|.. ConcreteProductA
Product <|.. ConcreteProductB
class ConcreteProductA{
+Create()
}
class ConcreteProductB{
+Create()
}
class Product{
<<interface>>
+Create()
}
Factroy --> Product
class Factroy{
+CreateProduct() Product
}
3.3 代碼示例
3.3.1 設(shè)計(jì)
- 定義一個(gè)抽象產(chǎn)品
Product - 定義三個(gè)具體產(chǎn)品
ConcreteProductA、ConcreteProductB、ConcreteProductC- 它們各自的
Get()方法會(huì)訪(fǎng)問(wèn)它本身
- 它們各自的
- 定義一個(gè)簡(jiǎn)單工廠(chǎng)
- 簡(jiǎn)單工廠(chǎng)的CreateProduct()方法會(huì)返回一個(gè)產(chǎn)品
- 調(diào)用
- 實(shí)例化一個(gè)簡(jiǎn)單工廠(chǎng)
- 用簡(jiǎn)單工廠(chǎng)創(chuàng)建一個(gè)產(chǎn)品
- 用產(chǎn)品的Get()方法查詢(xún)結(jié)果
3.3.2 代碼
package main
import (
"fmt"
)
type Product interface {
Get()
}
type ConcreteProductA struct {
Name string
Kind string
}
func (c *ConcreteProductA) Get() {
fmt.Printf("%+v", c)
}
type ConcreteProductB struct {
Name string
Kind string
}
func (c *ConcreteProductB) Get() {
fmt.Printf("%+v", c)
}
type ConcreteProductC struct {
Name string
Kind string
}
func (c *ConcreteProductC) Get() {
fmt.Printf("%+v", c)
}
type Factroy struct {
}
func (f *Factroy) CreateProduct(myType int64, name string) Product {
switch myType {
case 1:
return &ConcreteProductA{
Name: name,
Kind: "A",
}
case 2:
return &ConcreteProductB{
Name: name,
Kind: "B",
}
case 3:
return &ConcreteProductC{
Name: name,
Kind: "C",
}
}
return nil
}
func main() {
factory := &Factroy{}
product := factory.CreateProduct(1, "nginx")
product.Get()
}
- 輸出
&{Name:nginx Kind:A}
3.3.3 類(lèi)圖

image.png
classDiagram
Product <|.. ConcreteProductA
Product <|.. ConcreteProductB
Product <|.. ConcreteProductC
class ConcreteProductA{
+Name
+Kind
+Cet()
}
class ConcreteProductB{
+Name
+Kind
+Get()
}
class ConcreteProductC{
+Name
+Kind
+Get()
}
class Product{
<<interface>>
+Get()
}
Factroy --> Product
class Factroy{
+CreateProduct() Product
}
