From adb0305f4849a65498762b45f3b1c5f2840ad171 Mon Sep 17 00:00:00 2001 From: Pedro Correa Date: Mon, 7 Oct 2024 23:48:08 -0300 Subject: [PATCH] :sparkles: (Go) design patterns project --- .../abstract-factory/SportFactory.go | 24 ++++++++++ .../abstract-factory/abstract_test.go | 47 +++++++++++++++++++ Go/design-patterns/abstract-factory/adidas.go | 21 +++++++++ .../abstract-factory/adidasShirt.go | 5 ++ .../abstract-factory/adidasShoe.go | 5 ++ Go/design-patterns/abstract-factory/nike.go | 21 +++++++++ .../abstract-factory/nikeShirt.go | 5 ++ .../abstract-factory/nikeShoe.go | 5 ++ Go/design-patterns/abstract-factory/shirt.go | 29 ++++++++++++ Go/design-patterns/abstract-factory/shoe.go | 29 ++++++++++++ Go/design-patterns/go.mod | 3 ++ 11 files changed, 194 insertions(+) create mode 100644 Go/design-patterns/abstract-factory/SportFactory.go create mode 100644 Go/design-patterns/abstract-factory/abstract_test.go create mode 100644 Go/design-patterns/abstract-factory/adidas.go create mode 100644 Go/design-patterns/abstract-factory/adidasShirt.go create mode 100644 Go/design-patterns/abstract-factory/adidasShoe.go create mode 100644 Go/design-patterns/abstract-factory/nike.go create mode 100644 Go/design-patterns/abstract-factory/nikeShirt.go create mode 100644 Go/design-patterns/abstract-factory/nikeShoe.go create mode 100644 Go/design-patterns/abstract-factory/shirt.go create mode 100644 Go/design-patterns/abstract-factory/shoe.go create mode 100644 Go/design-patterns/go.mod diff --git a/Go/design-patterns/abstract-factory/SportFactory.go b/Go/design-patterns/abstract-factory/SportFactory.go new file mode 100644 index 0000000..03ed5ce --- /dev/null +++ b/Go/design-patterns/abstract-factory/SportFactory.go @@ -0,0 +1,24 @@ +package abstractfactory + +import ( + "errors" +) + +type ISportFactory interface { + makeShoe() IShoe + makeShirt() IShirt +} + +const ErrUnmappedBrand = "Wrong brand type passed" + +func GetSportsFactory(brand string) (ISportFactory, error) { + if brand == "adidas" { + return &Adidas{}, nil + } + + if brand == "nike" { + return &Nike{}, nil + } + + return nil, errors.New(ErrUnmappedBrand) +} diff --git a/Go/design-patterns/abstract-factory/abstract_test.go b/Go/design-patterns/abstract-factory/abstract_test.go new file mode 100644 index 0000000..e0d7826 --- /dev/null +++ b/Go/design-patterns/abstract-factory/abstract_test.go @@ -0,0 +1,47 @@ +package abstractfactory + +import ( + "testing" +) + +func TestAbstract_Factory(t *testing.T) { + t.Run("should create a factory for adidas", func(t *testing.T) { + want := "adidas" + adidasFactory, _ := GetSportsFactory(want) + + adidasShoe := adidasFactory.makeShoe() + adidasShirt := adidasFactory.makeShirt() + + AssertString(t, adidasShoe.getLogo(), want) + AssertString(t, adidasShirt.getLogo(), want) + }) + + t.Run("should create a factory for nike", func(t *testing.T) { + want := "nike" + nikeFactory, _ := GetSportsFactory(want) + + nikeShoe := nikeFactory.makeShoe() + nikeShirt := nikeFactory.makeShirt() + + AssertString(t, nikeShoe.getLogo(), want) + AssertString(t, nikeShirt.getLogo(), want) + }) + + t.Run("shoult throw an error when unmapped brand is passed", func(t *testing.T) { + _, err := GetSportsFactory("puma") + + if err == nil { + t.Fatal("expected an error but did not received it") + } + + AssertString(t, err.Error(), ErrUnmappedBrand) + }) +} + +func AssertString(t testing.TB, got, want string) { + t.Helper() + + if got != want { + t.Errorf("expected logo to be %s, got %s", want, got) + } +} diff --git a/Go/design-patterns/abstract-factory/adidas.go b/Go/design-patterns/abstract-factory/adidas.go new file mode 100644 index 0000000..60d1466 --- /dev/null +++ b/Go/design-patterns/abstract-factory/adidas.go @@ -0,0 +1,21 @@ +package abstractfactory + +type Adidas struct {} + +func (a *Adidas) makeShoe() IShoe { + return &AdidasShoes { + Shoe: Shoe{ + logo: "adidas", + size: 14, + }, + } +} + +func (a *Adidas) makeShirt() IShirt { + return &AdidasShirt{ + Shirt: Shirt{ + logo: "adidas", + size: 14, + }, + } +} diff --git a/Go/design-patterns/abstract-factory/adidasShirt.go b/Go/design-patterns/abstract-factory/adidasShirt.go new file mode 100644 index 0000000..2879a7c --- /dev/null +++ b/Go/design-patterns/abstract-factory/adidasShirt.go @@ -0,0 +1,5 @@ +package abstractfactory + +type AdidasShirt struct { + Shirt +} diff --git a/Go/design-patterns/abstract-factory/adidasShoe.go b/Go/design-patterns/abstract-factory/adidasShoe.go new file mode 100644 index 0000000..aa5d77c --- /dev/null +++ b/Go/design-patterns/abstract-factory/adidasShoe.go @@ -0,0 +1,5 @@ +package abstractfactory + +type AdidasShoes struct { + Shoe +} diff --git a/Go/design-patterns/abstract-factory/nike.go b/Go/design-patterns/abstract-factory/nike.go new file mode 100644 index 0000000..24687b0 --- /dev/null +++ b/Go/design-patterns/abstract-factory/nike.go @@ -0,0 +1,21 @@ +package abstractfactory + +type Nike struct {} + +func (n *Nike) makeShoe() IShoe { + return &NikeShoe{ + Shoe: Shoe{ + logo: "nike", + size: 14, + }, + } +} + +func (n *Nike) makeShirt() IShirt { + return &NikeShirt{ + Shirt: Shirt{ + logo: "nike", + size: 14, + }, + } +} diff --git a/Go/design-patterns/abstract-factory/nikeShirt.go b/Go/design-patterns/abstract-factory/nikeShirt.go new file mode 100644 index 0000000..68d9ee2 --- /dev/null +++ b/Go/design-patterns/abstract-factory/nikeShirt.go @@ -0,0 +1,5 @@ +package abstractfactory + +type NikeShirt struct { + Shirt +} diff --git a/Go/design-patterns/abstract-factory/nikeShoe.go b/Go/design-patterns/abstract-factory/nikeShoe.go new file mode 100644 index 0000000..746e9a5 --- /dev/null +++ b/Go/design-patterns/abstract-factory/nikeShoe.go @@ -0,0 +1,5 @@ +package abstractfactory + +type NikeShoe struct { + Shoe +} diff --git a/Go/design-patterns/abstract-factory/shirt.go b/Go/design-patterns/abstract-factory/shirt.go new file mode 100644 index 0000000..91e6071 --- /dev/null +++ b/Go/design-patterns/abstract-factory/shirt.go @@ -0,0 +1,29 @@ +package abstractfactory + +type IShirt interface { + setLogo(logo string) + setSize(size int) + getLogo() string + getSize() int +} + +type Shirt struct { + logo string + size int +} + +func (s *Shirt) setLogo(logo string) { + s.logo = logo +} + +func (s *Shirt) setSize(size int) { + s.size = size +} + +func (s *Shirt) getLogo() string { + return s.logo +} + +func (s *Shirt) getSize() int { + return s.size +} diff --git a/Go/design-patterns/abstract-factory/shoe.go b/Go/design-patterns/abstract-factory/shoe.go new file mode 100644 index 0000000..0fb0c68 --- /dev/null +++ b/Go/design-patterns/abstract-factory/shoe.go @@ -0,0 +1,29 @@ +package abstractfactory + +type IShoe interface { + setLogo(logo string) + setSize(size int) + getLogo() string + getSize() int +} + +type Shoe struct { + logo string + size int +} + +func (s *Shoe) setLogo(logo string) { + s.logo = logo +} + +func (s *Shoe) setSize(size int) { + s.size = size +} + +func (s *Shoe) getLogo() string { + return s.logo +} + +func (s *Shoe) getSize() int { + return s.size +} diff --git a/Go/design-patterns/go.mod b/Go/design-patterns/go.mod new file mode 100644 index 0000000..d35de42 --- /dev/null +++ b/Go/design-patterns/go.mod @@ -0,0 +1,3 @@ +module github.com/tulkdan/design-patterns.git + +go 1.21.7 -- 2.51.2