抽象ファクトリ/(キット)
1.意図
特定のクラスを指定せずに、一連の関連オブジェクトまたは相互依存オブジェクトを作成するためのインターフェースを提供します。
2.適用性
AbstractFactoryモードは、次の状況で使用できます。
- システムは、その製品の作成、組み合わせ、および表示から独立している必要があります。
- 複数の製品シリーズのいずれかでシステムを構成する場合。
- 共同使用する一連の関連製品オブジェクトのデザインを強調したい場合。
- 製品クラスライブラリを提供するが、実装ではなくインターフェイスのみを表示したい場合。
3.構造
4.コード
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()
}