The Factory design pattern is widely used in object-oriented programming. It provides an interface for creating objects, but allows subclasses to decide which classes to instantiate. In this article, we will explore how to implement the Factory pattern in Golang, understand its benefits and analyze a practical example of use inspired by everyday situations.
Factory defines an interface for creating objects, but delegates the responsibility for instantiating the concrete class to subclasses. This promotes the creation of objects in a decoupled and flexible way, allowing the code to be more modular and easier to maintain.
Let's use an everyday example to illustrate the Factory pattern: a system for ordering food, where some different types of meals (Pizza and Salad) can be created.
First, we need to define an interface that will be implemented by all "concrete classes" of meals.
package main type Food interface { Prepare() }
To make our lives easier during development and avoid typing something wrong during validation, a good practice is to create an ENUM to have consistency and also make it easier if we want to add new foods in the future
package main type FoodType int const ( PizzaType FoodType = iota SaladType ) type Food interface { Prepare() }
And now let's implement the Food interface. In the example we will just display a message, in real life this is where the object we are working on would be created
package main type FoodType int const ( PizzaType FoodType = iota SaladType ) type Food interface { Prepare() } type Pizza struct{} func (p Pizza) Prepare() { fmt.Println("Preparing a Pizza...") } type Salad struct{} func (s Salad) Prepare() { fmt.Println("Preparing a Salad...") }
Now, let's create the factory that will decide which concrete class to instantiate based on the enum it received as a parameter.
package main type FoodFactory struct{} func (f FoodFactory) CreateFood(ft FoodType) Food { switch ft { case PizzaType: return &Pizza{} case SaladType: return &Salad{} default: return nil } }
Finally, we will use the factory to create our food.
package main func main() { kitchen := FoodFactory{} pizza := kitchen.CreateFood(PizzaType) if pizza != nil { pizza.Prepare() } salad := kitchen.CreateFood(SaladType) if salad != nil { salad.Prepare() } }
This will be the result after running our application:
Preparing a Pizza... Preparing a Salad...
The Factory design pattern is a powerful tool for promoting decoupling and flexibility in object creation. In Golang, the implementation of this pattern is direct and effective, allowing the creation of modular and easy-to-maintain systems. Using interfaces and factories, we can centralize creation logic and simplify code evolution as new requirements emerge.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3