こんにちは、Habr!Shubham Zanwarによる次の記事 「 DesignPatterns :AbstractFactoryPattern」の翻訳を紹介します。
抽象ファクトリーは、生成的な設計パターンです。これは、同様の製品のファミリーを作成する必要がある場合に使用されます。理解のためにピザチェーンの例を見てみましょう。
ピッツェリア
あなたがビジネスの責任者であり、街中にピッツェリアのチェーンを開いているとしましょう。あなたの責任の1つは、DominoやRoasterなどのブランドによって代表されるすべての主要製品(この場合はピザと揚げニンニクパン)の生産です(それらをそう呼びましょう-約Transl。)。
これを行うには多くの方法があります。最も簡単な方法は、ブランドごとにピザ工場を作り、同様の揚げパン工場を作ることです。
問題は、ユーザーが適切な種類のピザとトーストしたパンを選択することを信頼していることです。彼らがフライポットのニンニクパンでドミノのピザを作るのを間違えると、あなたの顧客は激怒し、あなたはこれらのブランドとの契約を失う可能性があります。
, .
( ), . .
, , .
. , :
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")
}, .
覚えておくべき主なことは、抽象的なファクトリパターンがファクトリファクトリを実装することです。社内の工場は、適切な種類の製品を作成するために使用されます。
このコードはgithubにあります
一方