مرحبا هبر! أقدم انتباهكم إلى ترجمة المقال التالي "أنماط التصميم: نموذج المصنع التجريدي" لشوبهام زانوار.
المصنع التجريدي هو نمط تصميم توليدي. يتم استخدامه عندما نحتاج إلى إنشاء مجموعة من المنتجات المماثلة. لنأخذ مثالاً على سلسلة بيتزا لفهمها.
مطعم بيتزا
لنفترض أنك رئيس شركة وقمت بفتح سلسلة مطاعم بيتزا في جميع أنحاء المدينة. تتمثل إحدى مسؤولياتك في إنتاج جميع المنتجات الأساسية (في حالتنا ، البيتزا وخبز الثوم المقلي) ، والتي ستمثلها علامات تجارية مثل Domino and Roaster (دعنا نسميها كذلك - تقريبًا. Transl.).
هناك طرق عديدة للقيام بذلك. الأسهل هو إنشاء مصنع بيتزا لكل علامة تجارية ومصنع مماثل للخبز المقلي.
إذا لم تكن لديك أي فكرة عن كيفية عمل المصانع ، يمكنك القراءة هنا
تكمن المشكلة الآن في أننا نثق الآن في أن المستخدم يختار النوع المناسب من البيتزا والخبز المحمص الذي يريده. إذا ارتكبوا خطأ صنع دومينوز بيتزا مع خبز الثوم في فريبوت ، فسيكون عملاؤك غاضبين وقد تفقد عقدك مع هذه العلامات التجارية.
لا تقلق ، هناك طريقة سهلة.
بدلاً من إنشاء مصنع لكل منتج (بيتزا أو خبز مقلي) ، يمكنك إنشاء مصنع لكل علامة تجارية. وسينتج المصنّعان البيتزا والخبز المقلي.
بعد أن فتحت مطعمًا للبيتزا ، فإنك تمنح المدير مصنع Domino أو Brazier ويمكنك الراحة ، لأنه لن يربك أحد الآن أي شيء.
دعنا نلقي نظرة على الكود. قبل أن نكتب المصانع ، دعونا ننشئ المنتجات بأنفسهم:
بيتزا عادية
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
}الآن علامتنا التجارية: Brazier Factory و Domino Factory بوظائف موحدة
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")
}, .
الشيء الرئيسي الذي يجب تذكره هو أن نمط المصنع المجرد يطبق مصنع مصنع. تُستخدم المصانع الداخلية لإنشاء النوع المناسب من المنتجات.
يمكنك العثور على هذا الرمز على جيثب
في حين