Fábrica abstracta / (Kit)
1. Intención
Proporcionar una interfaz para crear una serie de objetos relacionados o interdependientes sin especificar sus clases específicas.
2. Aplicabilidad
El modo AbstractFactory se puede utilizar en las siguientes situaciones:
- Un sistema debe ser independiente de la creación, combinación y presentación de sus productos.
- Cuando un sistema debe ser configurado por una de varias series de productos.
- Cuando desee enfatizar el diseño de una serie de objetos de producto relacionados para uso conjunto.
- Cuando proporcionas una biblioteca de clases de productos, pero solo quieres mostrar su interfaz en lugar de la implementación.
3. Estructura
4. Código
package abstract
import (
"fmt"
"testing"
)
// 抽象工厂模式
type Girl interface {
weight()
}
// 中国胖女孩
type ChinaFatGirl struct {
}
func (ChinaFatGirl) weight() {
fmt.Println("中国胖女孩体重: 80kg")
}
// 瘦女孩
type ChinaThinGirl struct {
}
func (ChinaThinGirl) weight() {
fmt.Println("中国瘦女孩体重: 50kg")
}
type Factory interface {
CreateGirl(like string) Girl
}
// 中国工厂
type ChineseGirlFactory struct {
}
func (ChineseGirlFactory) CreateGirl(like string) Girl {
if like == "fat" {
return &ChinaFatGirl{
}
} else if like == "thin" {
return &ChinaThinGirl{
}
}
return nil
}
// 美国工厂
type AmericanGirlFactory struct {
}
func (AmericanGirlFactory) CreateGirl(like string) Girl {
if like == "fat" {
return &AmericanFatGirl{
}
} else if like == "thin" {
return &AmericanThainGirl{
}
}
return nil
}
// 美国胖女孩
type AmericanFatGirl struct {
}
func (AmericanFatGirl) weight() {
fmt.Println("American weight: 80kg")
}
// 美国瘦女孩
type AmericanThainGirl struct {
}
func (AmericanThainGirl) weight() {
fmt.Println("American weight: 50kg")
}
// 工厂提供者
type GirlFactoryStore struct {
factory Factory
}
func (store *GirlFactoryStore) createGirl(like string) Girl {
return store.factory.CreateGirl(like)
}
func TestAbstractFactory(t *testing.T) {
store := new(GirlFactoryStore)
// 提供美国工厂
store.factory = new(AmericanGirlFactory)
americanFatGirl := store.createGirl("fat")
americanFatGirl.weight()
// 提供中国工厂
store.factory = new(ChineseGirlFactory)
chineseFatGirl := store.createGirl("thin")
chineseFatGirl.weight()
}