建造者设计模式go实现尝试

文章目录


前言

本文章尝试使用go实现"建造者"。


代码

go 复制代码
package main

import (
	"fmt"
)

// 产品1。可以有不同的毫无相关的产品,这里只举一个
type Product1 struct {
	parts []string
}

// 产品1逻辑。打印组成产品的部分
func (p *Product1) ListParts() {
	parts := p.parts
	length := len(parts)
	fmt.Print("Product parts: ")
	for i := 0; i < length; i++ {
		if i == length-1 {
			fmt.Print(parts[i])
		} else {
			fmt.Print(parts[i], ", ")
		}
	}
	fmt.Println()
	fmt.Println()
}

// 建造者接口提供分别创建所有产品部分的方法。这里举例产品最多有三个部分。
// 返回IBuilder接口,以便链式调用
// 由于组建完成后要返回的产品各式各样,比如产品1、2、3......,可能没有相同的接口,这里就不提供返回产品的方法了
type IBuilder interface {
	ProducePartA() IBuilder
	ProducePartB() IBuilder
	ProducePartC() IBuilder
}

// 具体建造者1。对应返回产品1,这里只举一个。按不同配置需求返回的产品1也不尽相同
type ConcreteBuilder1 struct {
	product Product1
}

func (cb *ConcreteBuilder1) Reset() {
	cb.product = Product1{}
}

func (cb *ConcreteBuilder1) ProducePartA() IBuilder {
	cb.product.parts = append(cb.product.parts, "PartA1")
	return cb
}

func (cb *ConcreteBuilder1) ProducePartB() IBuilder {
	cb.product.parts = append(cb.product.parts, "PartB1")
	return cb
}

func (cb *ConcreteBuilder1) ProducePartC() IBuilder {
	cb.product.parts = append(cb.product.parts, "PartC1")
	return cb
}

// 获取产品1。不同产品可能没有共同的实现接口,故返回类型为具体产品类
func (cb *ConcreteBuilder1) GetProduct() Product1 {
	result := cb.product
	cb.Reset()
	return result
}

// go语言使用普通函数实现构造函数
func NewConcreteBuilder1() *ConcreteBuilder1 {
	cb := ConcreteBuilder1{}
	cb.Reset()
	return &cb
}

// 主管。接收建造者,并根据配置需求要求建造者创建包含部分组件的对象
type Director struct {
	builder IBuilder
}

func (d *Director) SetBuilder(builder IBuilder) {
	d.builder = builder
}

func (d *Director) BuildMinimalViableProduct() {
	d.builder.ProducePartA()
}

func (d *Director) BuildFullFeaturedProduct() {
	d.builder.ProducePartA().ProducePartB().ProducePartC()
}

// 客户端代码
func clientCode(d *Director) {
	builder := NewConcreteBuilder1()
	d.SetBuilder(builder)
	fmt.Println("Standard basic product:")
	d.BuildMinimalViableProduct()

	p := builder.GetProduct()
	p.ListParts()

	fmt.Println("Standard full featured product:")
	d.BuildFullFeaturedProduct()

	p = builder.GetProduct()
	p.ListParts()

	// 不通过主管也能自定义创建产品
	fmt.Println("Custom product:")
	builder.ProducePartA()
	builder.ProducePartC()
	p = builder.GetProduct()
	p.ListParts()
}

func main() {
	clientCode(&Director{})
}

结果

复制代码
Standard basic product:
Product parts: PartA1

Standard full featured product:
Product parts: PartA1, PartB1, PartC1

Custom product:
Product parts: PartA1, PartC1

总结

新人设计模式理解,望大家多多指点。

相关推荐
tachibana211 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
王中阳Go12 小时前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型
for_ever_love__18 小时前
LangChain Agentic RAG:让 Agent 自己决定要不要检索、检索几次
人工智能·golang·langchain·rag·langgraph·agentic·自适应检索
范中勤18 小时前
技术文档:模型工厂 `llm_provider` / `llm_use` 分层设计
设计模式·langchain·架构设计·模型工厂·llm_provider
谢亮_vipxieliang19 小时前
Go gRPC基础与实战
开发语言·后端·golang
徐小黑ACG20 小时前
Golang goroutine、通道、锁
开发语言·后端·golang
浅尝辄止;21 小时前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
范中勤21 小时前
适配器模式(Adapter Pattern):原理、场景与 LLM 多厂商工程落地
设计模式·架构·langchain·适配器模式·多厂商
408高手1 天前
23种设计模式
设计模式
沫璃染墨1 天前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构