文章目录
前言
本文章尝试使用go实现"抽象工厂"。
代码
go
package main
import (
"fmt"
)
// 所有系列产品A接口
type IAbstractProductA interface {
UsefulFunctionA() string
}
// 系列1具体产品A
type ConcreteProductA1 struct {
}
func (ConcreteProductA1) UsefulFunctionA() string {
return "The result of the product A1."
}
// 系列2具体产品A
type ConcreteProductA2 struct {
}
func (ConcreteProductA2) UsefulFunctionA() string {
return "The result of the product A2."
}
// 所有系列产品B接口
type IAbstractProductB interface {
UsefulFunctionB() string
AnotherUsefulFunctionB(collaborator IAbstractProductA) string
}
// 系列1具体产品B
type ConcreteProductB1 struct {
}
func (ConcreteProductB1) UsefulFunctionB() string {
return "The result of the product B1."
}
func (ConcreteProductB1) AnotherUsefulFunctionB(collaborator IAbstractProductA) string {
result := collaborator.UsefulFunctionA()
return fmt.Sprintf("The result of the B1 collaborating with the (%s)", result)
}
// 系列2具体产品B
type ConcreteProductB2 struct {
}
func (ConcreteProductB2) UsefulFunctionB() string {
return "The result of the product B2."
}
func (ConcreteProductB2) AnotherUsefulFunctionB(collaborator IAbstractProductA) string {
result := collaborator.UsefulFunctionA()
return fmt.Sprintf("The result of the B2 collaborating with the (%s)", result)
}
// 抽象工厂接口定义一系列方法返回同个系列的若干抽象产品
type IAbstractFactory interface {
CreateProductA() IAbstractProductA
CreateProductB() IAbstractProductB
}
// 具体工厂1
type ConcreteFactory1 struct {
}
func (ConcreteFactory1) CreateProductA() IAbstractProductA {
return &ConcreteProductA1{}
}
func (ConcreteFactory1) CreateProductB() IAbstractProductB {
return &ConcreteProductB1{}
}
// 具体工厂2
type ConcreteFactory2 struct {
}
func (ConcreteFactory2) CreateProductA() IAbstractProductA {
return &ConcreteProductA2{}
}
func (ConcreteFactory2) CreateProductB() IAbstractProductB {
return &ConcreteProductB2{}
}
// 客户端代码
func clientCode(factory IAbstractFactory) {
product_a := factory.CreateProductA()
product_b := factory.CreateProductB()
fmt.Println(product_b.UsefulFunctionB())
fmt.Println(product_b.AnotherUsefulFunctionB(product_a))
}
func main() {
fmt.Println("Client: Testing client code with the first factory type:")
clientCode(&ConcreteFactory1{})
fmt.Println()
fmt.Println("Client: Testing the same client code with the second factory type:")
clientCode(&ConcreteFactory2{})
}
结果
Client: Testing client code with the first factory type:
The result of the product B1.
The result of the B1 collaborating with the (The result of the product A1.)
Client: Testing the same client code with the second factory type:
The result of the product B2.
The result of the B2 collaborating with the (The result of the product A2.)
总结
新人设计模式理解,望大家多多指点。