From d6643e83e009919905c0f09c700d3e06c2131633 Mon Sep 17 00:00:00 2001 From: Shubham Zanwar Date: Fri, 25 Sep 2020 19:00:01 +0530 Subject: [PATCH] =?UTF-8?q?implementing=20the=20abstract=20factory=20?= =?UTF-8?q?=F0=9F=94=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-abstract-factory/README.md | 0 2-abstract-factory/abstractFactory.go | 18 ++++++++++++++ 2-abstract-factory/dominos.go | 30 +++++++++++++++++++++++ 2-abstract-factory/genericGarlicBread.go | 19 +++++++++++++++ 2-abstract-factory/genericPizza.go | 25 +++++++++++++++++++ 2-abstract-factory/main.go | 31 ++++++++++++++++++++++++ 2-abstract-factory/pizzaHut.go | 30 +++++++++++++++++++++++ 7 files changed, 153 insertions(+) create mode 100644 2-abstract-factory/README.md create mode 100644 2-abstract-factory/abstractFactory.go create mode 100644 2-abstract-factory/dominos.go create mode 100644 2-abstract-factory/genericGarlicBread.go create mode 100644 2-abstract-factory/genericPizza.go create mode 100644 2-abstract-factory/main.go create mode 100644 2-abstract-factory/pizzaHut.go diff --git a/2-abstract-factory/README.md b/2-abstract-factory/README.md new file mode 100644 index 0000000..e69de29 diff --git a/2-abstract-factory/abstractFactory.go b/2-abstract-factory/abstractFactory.go new file mode 100644 index 0000000..f07503c --- /dev/null +++ b/2-abstract-factory/abstractFactory.go @@ -0,0 +1,18 @@ +package main + +import "fmt" + +type iPizzaFactory interface { + createPizza() iPizza + createGarlicBread() iGarlicBread +} + +func getFactory(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") +} diff --git a/2-abstract-factory/dominos.go b/2-abstract-factory/dominos.go new file mode 100644 index 0000000..980caeb --- /dev/null +++ b/2-abstract-factory/dominos.go @@ -0,0 +1,30 @@ +package main + +type dominosFactory struct{} + +type dominosPizza struct { + pizza +} + +type dominosGarlicBread struct { + garlicBread +} + +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, + }, + } +} diff --git a/2-abstract-factory/genericGarlicBread.go b/2-abstract-factory/genericGarlicBread.go new file mode 100644 index 0000000..4e899a6 --- /dev/null +++ b/2-abstract-factory/genericGarlicBread.go @@ -0,0 +1,19 @@ +package main + +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 +} diff --git a/2-abstract-factory/genericPizza.go b/2-abstract-factory/genericPizza.go new file mode 100644 index 0000000..67533f9 --- /dev/null +++ b/2-abstract-factory/genericPizza.go @@ -0,0 +1,25 @@ +package main + +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 +} diff --git a/2-abstract-factory/main.go b/2-abstract-factory/main.go new file mode 100644 index 0000000..1d64152 --- /dev/null +++ b/2-abstract-factory/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strings" +) + +func describePizza(pizza iPizza) { + fmt.Printf("the pizza %s has toppings %s. It costs Rs. %.2f\n", pizza.GetName(), strings.Join(pizza.GetToppings(), ", "), pizza.GetPrice()) +} + +func describeGarlicBread(garlicBread iGarlicBread) { + fmt.Printf("the garlic bread, %s costs Rs. %.2f\n", garlicBread.GetName(), garlicBread.GetPrice()) +} + +func main() { + reader := bufio.NewReader(os.Stdin) + fmt.Println("Dominos or PizzaHut? (D/P)") + pizzaType, _ := reader.ReadString('\n') + pizzaType = strings.Split(pizzaType, "\n")[0] + + pizzaFactory, _ := getFactory(pizzaType) + + pizza := pizzaFactory.createPizza() + garlicBread := pizzaFactory.createGarlicBread() + + describePizza(pizza) + describeGarlicBread(garlicBread) +} diff --git a/2-abstract-factory/pizzaHut.go b/2-abstract-factory/pizzaHut.go new file mode 100644 index 0000000..d780489 --- /dev/null +++ b/2-abstract-factory/pizzaHut.go @@ -0,0 +1,30 @@ +package main + +type pizzaHutFactory struct{} + +type pizzaHutPizza struct { + pizza +} + +type pizzaHutGarlicBread struct { + garlicBread +} + +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, + }, + } +}