diff --git a/README.md b/README.md index e6f0d57..33d8b75 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,44 @@ -# golang-design-patterns -Implementation of design patterns in Golang +# Design patterns in golang +>A beginner guide... happy coding! +## Table of Contents -### Table of contents -**[Creational Patterns](#creational-patterns)**
-**[Structural Patterns](#structural-patterns)**
-**[Behavioral Patterns](#behavioral-patterns)**
\ No newline at end of file +- [Creational patterns](#creational-patterns) + - [Singleton](#singleton) + - [Builder](#builder) +- [Structural patterns](#structural-patterns) + - [Composition](#composition) +- [Behavioral patterns](#behavioral-patterns) +- [Concurrency patterns](#concurrency-patterns) + +--- + +## Creational patterns +Creational design patterns abstract the instantiation process. They help make a system independent of how its objects are created, composed, and represented. + +### Singleton +Ensure a class only has one instance, and provide a global point of access to it. + +### Builder +Separate the construction of a complex object from its representation so that the +same construction process can create different representations. + +## Structural patterns +Structural patterns are concerned with how classes and objects are composed to form +larger structures. Structural class patterns use inheritance to compose interfaces or implementations. +As a simple example, consider how multiple inheritance mixes two or +more classes into one. + +### Composition +Compose objects into tree structures to represent part-whole hierarchies. Composite +lets clients treat individual objects and compositions of objects uniformly. + +## Behavioral patterns +Behavioral patterns are concerned with algorithms and the assignment of responsibilities +between objects. Behavio ral patterns describe not just patterns of objects or classes +but also the patterns of communication between them. These patterns characterize +complex control flow that's difficult to follow at run-time. They shift your focus away +from flow of control to let you concent ratejust on the way objects are interconnected. + +## Concurrency patterns +Pattenrs for concurrent work and parallel execution in Go. \ No newline at end of file diff --git a/structural/composition/byembeding.go b/structural/composition/byembeding.go new file mode 100644 index 0000000..9ba8ced --- /dev/null +++ b/structural/composition/byembeding.go @@ -0,0 +1,35 @@ +package composition + +import ( + "fmt" +) + +type Car struct { + WheelCount uint8 + Speed int + DoorCount uint8 + Brand string +} + +func (c *Car) Drive() { + fmt.Println("Goes with speed: %d", c.Speed) +} + +type FlyingCar struct { + Car + WingLength float32 + FlySpeed int +} + +func (c *FlyingCar) Fly() { + fmt.Println("Flies with speed: %d", c.FlySpeed) +} + +type SwimmingCar struct { + Car + SwimSpeed int +} + +func (c *SwimmingCar) Swimm() { + fmt.Println("Swimm with speed: %d", c.SwimSpeed) +} \ No newline at end of file diff --git a/structural/composition/byinterface.go b/structural/composition/byinterface.go new file mode 100644 index 0000000..e637b7a --- /dev/null +++ b/structural/composition/byinterface.go @@ -0,0 +1,56 @@ +package composition + +import ( + "fmt" +) + +type Driver interface { + Drive() +} + +type Cleaner interface{ + Clean() +} + +type Killer interface { + Kill() +} + +type Barker interface { + Bark() +} + +type Dog struct {} +func (d *Dog) Bark() { + fmt.Println("Wow!") +} + +type RobotDog struct {} +func (r *RobotDog) Drive() { + fmt.Println("Driving...") +} +func (r *RobotDog) Bark() { + fmt.Println("Wow!") +} + +type CleanerRobotDog struct {} +func (r *CleanerRobotDog) Drive() { + fmt.Println("Driving...") +} +func (r *CleanerRobotDog) Bark() { + fmt.Println("Wow!") +} +func (r *CleanerRobotDog) Clean() { + fmt.Println("Cleaning...") +} + +type KillerRobotDog struct {} +func (r *KillerRobotDog) Drive() { + fmt.Println("Driving...") +} +func (r *KillerRobotDog) Bark() { + fmt.Println("Wow!") +} +func (r *KillerRobotDog) Kill() { + fmt.Println("You gonna die!") +} \ No newline at end of file