Шаблоны создания — это шаблоны проектирования, которые имеют дело с механизмами создания объектов, пытаясь создать объекты способом, подходящим для ситуации. Вот несколько примеров шаблонов создания и того, как их можно реализовать в Go:

Singleton. Шаблон Singleton гарантирует, что класс имеет только один экземпляр, предоставляя при этом глобальную точку доступа к этому экземпляру.

Copy code
type Singleton struct {}
var instance *Singleton
func GetInstance() *Singleton {
	if instance == nil {
		instance = &Singleton{}
	}
	return instance
}

Фабричный метод. Шаблон фабричного метода определяет интерфейс для создания объекта, но позволяет подклассам решать, экземпляр какого класса создавать.

Copy code
type Creator interface {
	FactoryMethod() Product
}
type ConcreteCreator struct {}
func (c *ConcreteCreator) FactoryMethod() Product {
	return &ConcreteProduct{}
}

Builder: шаблон Builder отделяет построение сложного объекта от его представления, позволяя одному и тому же процессу построения создавать различные представления.

Copy code
type Builder interface {
	Part1()
	Part2()
	Part3()
}
type ConcreteBuilder struct {
	result Product
}
func (b *ConcreteBuilder) Part1() {
	// implementation
}
func (b *ConcreteBuilder) Part2() {
	// implementation
}
func (b *ConcreteBuilder) Part3() {
	// implementation
}

Прототип. Шаблон прототипа создает новые объекты путем копирования существующих объектов, которые служат прототипами.

Copy code
type Prototype interface {
	Clone() Prototype
}
type ConcretePrototype struct {
	// fields
}
func (p *ConcretePrototype) Clone() Prototype {
	// return a new instance with the same field values
}

Абстрактная фабрика. Шаблон абстрактной фабрики предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.

Copy code
type Animal interface {
	Speak() string
}
type Dog struct{}
func (d *Dog) Speak() string {
	return "Woof"
}
type Cat struct{}
func (c *Cat) Speak() string {
	return "Meow"
}
type AnimalFactory interface {
	CreateDog() Animal
	CreateCat() Animal
}
type ConcreteAnimals struct{}
func (c *ConcreteAnimals) CreateDog() Animal {
	return &Dog{}
}
func (c *ConcreteAnimals) CreateCat() Animal {
	return &Cat{}
}

Стоит отметить, что эти примеры являются упрощенными версиями каждого шаблона, и в реальных сценариях реализация может быть более сложной. Кроме того, это всего лишь несколько примеров создающих шаблонов, и существует множество других, которые можно использовать для повышения гибкости, удобства сопровождения и повторного использования вашего кода.