Pola Desain di Go - Pabrik Abstrak

Halo, Habr! Untuk perhatian Anda saya persembahkan terjemahan artikel berikutnya "Pola Desain: Pola Pabrik Abstrak" oleh Shubham Zanwar.

Pabrik abstrak adalah pola desain generatif. Ini digunakan ketika kita perlu membuat keluarga produk serupa. Mari kita ambil contoh rantai pizza untuk memahami.

Restoran pizza

Katakanlah Anda adalah kepala bisnis dan membuka rantai restoran pizza di seluruh kota. Salah satu tanggung jawab Anda adalah produksi semua produk pokok (dalam kasus kami, pizza dan roti bawang putih goreng), yang akan diwakili oleh merek-merek seperti Domino dan Roaster (sebut saja begitu - kira-kira. Terjemahan).

Ada banyak cara untuk melakukan ini. Yang paling mudah adalah membuat pabrik pizza untuk setiap merek dan yang serupa untuk roti goreng.

Jika Anda masih belum mengetahui cara kerja pabrik, Anda dapat membaca di sini

Masalahnya adalah kami sekarang mempercayai pengguna untuk memilih jenis pizza dan roti panggang yang mereka inginkan. Jika mereka membuat kesalahan dengan membuat Domino's Pizza dengan Frypot's Garlic Bread, pelanggan Anda akan sangat marah dan Anda bisa kehilangan kontrak dengan merek tersebut.

, .

( ), . .

, , .

. , :

type iPizza interface {
    GetPrice() float64
    GetName() string
    GetToppings() []string
}

type pizza struct {
    name     string
    price    float64
    toppings []string
}

func (p *pizza) GetName() string {
    return p.name
}

func (p *pizza) GetPrice() float64 {
    return p.price
}

func (p *pizza) GetToppings() []string {
    return p.toppings
}

type pizzaHutPizza struct {
    pizza
}

type dominosPizza struct {
    pizza
}

type iGarlicBread interface {
    GetPrice() float64
    GetName() string
}

type garlicBread struct {
    name  string
    price float64
}

func (g *garlicBread) GetName() string {
    return g.name
}

func (g *garlicBread) GetPrice() float64 {
    return g.price
}

type pizzaHutGarlicBread struct {
    garlicBread
}

type dominosGarlicBread struct {
    garlicBread
}

, , . .

,

type iPizzaFactory interface {
    createPizza() iPizza
    createGarlicBread() iGarlicBread
}

: - -

type PizzaHutFactory struct {}

func (p *PizzaHutFactory) createPizza(): iPizza {
    return &pizzaHutPizza{
        pizza{
            name:     "pepperoni",
            price:    230.3,
            toppings: []string{"olives", "mozzarella", "pork"},
        },
    }
}

func (p *pizzaHutFactory) createGarlicBread() iGarlicBread {
    return &pizzaHutGarlicBread{
        garlicBread{
            name:  "garlic bread",
            price: 180.99,
        },
    }
}
type dominosFactory struct{}

func (d *dominosFactory) createPizza() iPizza {
    return &dominosPizza{
        pizza{
            name:     "margherita",
            price:    200.5,
            toppings: []string{"tomatoes", "basil", "olive oil"},
        },
    }
}

func (d *dominosFactory) createGarlicBread() iGarlicBread {
    return &dominosGarlicBread{
        garlicBread{
            name:  "cheesy bread sticks",
            price: 150.00,
        },
    }
}

, /.

. , . ? .

. , ( ), ( ). "", .

-

func getPizzaFactory(chain string) (iPizzaFactory, error) {
    if chain == "P" {
        return &pizzaHutFactory{}, nil
    }
    if chain == "D" {
        return &dominosFactory{}, nil
    }
    return nil, fmt.Errorf("Enter a valid chain type next time")
}

, .

Hal utama yang perlu diingat adalah bahwa pola pabrik abstrak mengimplementasikan pabrik pabrik. Pabrik internal digunakan untuk membuat jenis produk yang tepat.

Anda dapat menemukan kode ini di github

Sementara




All Articles