Patrón de fábrica abstracta (Fábrica abstracta)

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

Inserte la descripción de la imagen aquí

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()
}

Supongo que te gusta

Origin blog.csdn.net/dawnto/article/details/112973355
Recomendado
Clasificación