抽象工廠模式與工廠模式類似,被認為是工廠方法模式的另一層抽象.抽象工廠模式圍繞創建其他工廠的超級工廠工作.
1.角色:
1.1抽象產品:
構成產品系列的一組不同但相關的產品的聲明接口.
1.2具體產品:
實現抽象產品接口的類,主要用于定義產品對象,由相應的具體工廠創建.
1.3抽象工廠:
創建抽象產品對象的操作接口.
1.4具體工廠:
實現抽象工廠接口的類.用于創建產品對象.每個具體工廠都會生產相應的具體產品.
1.5客戶端:
通過抽象接口調用抽象工廠對象和抽象產品對象,客戶端能與所有具體工廠或具體產品交互.
2.抽象工廠使用場景:
2.1出于對代碼未來擴展性考慮.不希望代碼基于具體產品進行構建,可以使用抽象工廠模式.
2.2某個類具有一組抽象方法,并且這個類功能不夠明確,可以考慮抽象工廠模式.
2.3如果一個類需要與多種類型的產品交互,可以考慮將工廠方法抽取到具備完整功能的抽象工廠接口中.
3.實現方式:
3.1抽象產品接口:
package itboStudyimport "fmt"// 抽象產品接口
type AbstractProduct interface {GetName()
}// 具體產品類
type Computer struct {
}//具體產品類中的方法
func (c *Computer) GetName() {fmt.Println("具體產品Computer")
}
3.2抽象工廠接口:
//抽象工廠接口
type AbstractFactory interface {CreateProduct() AbstractProduct
}
3.3具體工廠類及方法:
// 具體工廠類
type ComputerProductFactory struct{}// 初始化具體工廠對象.
func NewComputerProductFactory() ComputerProductFactory {return ComputerProductFactory{}
}// 使用具體工廠對象創建具體產品
func (com *ComputerProductFactory) CreateProduct() Computer {return Computer{}
}
3.4客戶端:
func main() {factory := itboStudy.NewComputerProductFactory()product := factory.CreateProduct()product.GetName()
}
4.實戰:
4.1抽象接口:
// 電子產品工廠
type InterfaceElectronicFactory interface {MakeComputer() InterfaceComputer
}// 獲取電子產品工廠對象
func GetElectronicFactory(brand string) (*LenovoFactory, error) {if brand == "電腦" {return &LenovoFactory{}, nil}return nil, fmt.Errorf("%s", "error brand type")
}
4.2具體工廠類:
// 定義具體工廠類
type LenovoFactory struct{}// 生成聯想電腦
func (com *LenovoFactory) MakeComputer() *LenovoComputer {return &LenovoComputer{Computer: Computer{color: "black",size: 14,},}
}
4.3抽象產品接口:
type InterfaceComputer interface {SetColor(color string)SetSize(size int)Getcolor() stringGetsize() int
}type Computer struct {color stringsize int
}func (com *Computer) SetColor(color string) {com.color = color
}func (com *Computer) SetSize(size int) {com.size = size
}func (com *Computer) GetSize() int {return com.size
}func (com *Computer) GetColor() string {return com.color
}
4.4具體產品類:
// 定義具體產品
type LenovoComputer struct {Computer
}
4.5客戶端:
func main() {factory, _ := itboStudy.GetElectronicFactory("電腦")computer := factory.MakeComputer()fmt.Printf("computer:%#v\n", computer.GetColor())
}
5優點:
客戶端不知道創建什么類型對象時.
抽象工廠實現了具體的隔離.
抽象工廠可以輕松改變產品系列.
保證產品一致性.
6.缺點:
抽象工廠難以擴展新型產品.如果要支持新型產品需要擴展工廠接口.
可以遲到,但是不會缺席.