golang-design-pattern中的创建型模式:对象创建的设计策略

golang-design-pattern中的创建型模式:对象创建的设计策略

【免费下载链接】golang-design-pattern 设计模式 Golang实现-《研磨设计模式》读书笔记 【免费下载链接】golang-design-pattern 项目地址: https://gitcode.com/gh_mirrors/go/golang-design-pattern

在软件开发中,对象的创建是最基础也最关键的环节之一。错误的对象创建方式可能导致代码耦合严重、扩展性差、难以维护等问题。本文将系统介绍golang-design-pattern项目中的6种创建型设计模式,帮助开发者掌握在不同场景下优雅创建对象的策略。通过具体的代码实现和应用场景分析,你将学会如何选择合适的创建模式,提升代码质量和可维护性。

创建型模式概览

创建型模式专注于对象创建过程的优化,通过封装对象创建逻辑,降低系统耦合度,提高灵活性。在golang-design-pattern项目中,创建型模式被组织为6个独立模块,涵盖了从简单对象到复杂对象的各种创建需求。

以下是所有创建型模式的列表及其对应的实现路径:

模式名称实现路径核心功能
简单工厂模式00_simple_factory/通过工厂函数根据条件创建不同类型对象
工厂方法模式04_factory_method/定义工厂接口,由子类决定具体产品创建
抽象工厂模式05_abstract_factory/创建一系列相关或依赖对象的家族
建造者模式06_builder/分步构建复杂对象,分离构建与表示
原型模式07_prototype/通过复制现有对象创建新对象
单例模式03_singleton/确保类只有一个实例,并提供全局访问点

简单工厂模式:条件创建的艺术

简单工厂模式(Simple Factory)通过一个统一的工厂函数,根据输入条件创建不同类型的对象实例。这种模式将对象创建逻辑集中管理,客户端只需关注使用对象,无需了解具体创建细节。

实现原理

00_simple_factory/simple.go中,定义了一个API接口和两个实现类hiAPIhelloAPI。工厂函数NewAPI根据输入的整数参数返回不同的接口实现:

// API 是接口
type API interface {
    Say(name string) string
}

// NewAPI 返回Api实例 by type
func NewAPI(t int) API {
    if t == 1 {
        return &hiAPI{}
    } else if t == 2 {
        return &helloAPI{}
    }
    return nil
}

应用场景

简单工厂模式适用于创建逻辑简单、产品类型较少且固定的场景。例如,在支付系统中根据支付方式类型(信用卡、支付宝、微信)创建不同的支付处理器。

优缺点分析

优点

  • 封装对象创建逻辑,客户端无需知道具体实现类
  • 降低客户端与具体产品的耦合度
  • 集中管理对象创建,便于修改和维护

缺点

  • 工厂函数可能变得庞大复杂,违反单一职责原则
  • 添加新产品需要修改工厂函数,违反开闭原则

工厂方法模式:将创建权下放

工厂方法模式(Factory Method)通过定义工厂接口,将具体产品的创建推迟到子类工厂。每个产品对应一个工厂,客户端通过工厂接口创建产品,无需直接实例化具体产品。

实现原理

04_factory_method/factorymethod.go中,定义了Operator产品接口和OperatorFactory工厂接口。具体工厂(如PlusOperatorFactoryMinusOperatorFactory)实现工厂接口,负责创建对应的产品实例:

// OperatorFactory 是工厂接口
type OperatorFactory interface {
    Create() Operator
}

// PlusOperatorFactory 是 PlusOperator 的工厂类
type PlusOperatorFactory struct{}

func (PlusOperatorFactory) Create() Operator {
    return &PlusOperator{
        OperatorBase: &OperatorBase{},
    }
}

应用场景

工厂方法模式适用于产品种类较多,且可能不断增加新种类的场景。例如,在日志系统中,针对不同的日志输出目标(文件、控制台、数据库)创建对应的日志记录器工厂。

抽象工厂模式:创建产品家族

抽象工厂模式(Abstract Factory)提供一个接口,用于创建一系列相关或相互依赖的对象家族,而无需指定具体类。这种模式特别适合需要协调多个相关产品创建的场景。

实现原理

05_abstract_factory/abstractfactory.go中,DAOFactory接口定义了创建订单主记录和详情记录的方法。RDBDAOFactoryXMLDAOFactory分别实现了这个接口,创建关系型数据库和XML存储的产品家族:

// DAOFactory DAO 抽象模式工厂接口
type DAOFactory interface {
    CreateOrderMainDAO() OrderMainDAO
    CreateOrderDetailDAO() OrderDetailDAO
}

// RDBDAOFactory 是RDB 抽象工厂实现
type RDBDAOFactory struct{}

func (*RDBDAOFactory) CreateOrderMainDAO() OrderMainDAO {
    return &RDBMainDAO{}
}

func (*RDBDAOFactory) CreateOrderDetailDAO() OrderDetailDAO {
    return &RDBDetailDAO{}
}

应用场景

抽象工厂模式适用于需要创建多个相关产品对象的场景,如不同数据库的访问层实现、不同操作系统的UI组件集等。

建造者模式:复杂对象的分步构建

建造者模式(Builder)将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。这种模式特别适合创建具有多个组成部分的复杂对象。

实现原理

06_builder/builder.go中,Builder接口定义了对象构建的步骤,Director负责控制构建流程,具体建造者(如Builder1Builder2)实现构建步骤并提供产品:

// Builder 是生成器接口
type Builder interface {
    Part1()
    Part2()
    Part3()
}

// Director 控制构建过程
type Director struct {
    builder Builder
}

// Construct Product
func (d *Director) Construct() {
    d.builder.Part1()
    d.builder.Part2()
    d.builder.Part3()
}

应用场景

建造者模式适用于创建复杂对象,如配置对象、文档对象、报表对象等。例如,在构建一个包含多个章节、图表和附录的PDF文档时,可以使用建造者模式分步构建各个部分。

原型模式:通过复制创建对象

原型模式(Prototype)通过复制现有对象来创建新对象,而无需知道具体类信息。这种模式特别适合创建成本高或构造复杂的对象。

实现原理

07_prototype/prototype.go中,定义了Cloneable接口,任何需要支持复制的对象都需实现此接口。PrototypeManager作为原型管理器,存储和管理原型对象:

// Cloneable 是原型对象需要实现的接口
type Cloneable interface {
    Clone() Cloneable
}

// PrototypeManager 管理原型对象
type PrototypeManager struct {
    prototypes map[string]Cloneable
}

func (p *PrototypeManager) Get(name string) Cloneable {
    return p.prototypes[name].Clone()
}

应用场景

原型模式适用于以下场景:

  • 对象创建成本高,如需要复杂计算或网络请求
  • 需要避免构造函数的约束
  • 系统需要动态加载未知类型的对象

单例模式:唯一实例的全局访问

单例模式(Singleton)确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于管理共享资源,如配置信息、连接池等。

实现原理

03_singleton/singleton.go中,使用sync.Once确保实例只被初始化一次,通过GetInstance方法提供全局访问:

var (
    instance *singleton
    once     sync.Once
)

// GetInstance 用于获取单例模式对象
func GetInstance() Singleton {
    once.Do(func() {
        instance = &singleton{}
    })
    return instance
}

应用场景

单例模式适用于需要唯一实例的场景,如:

  • 配置管理器
  • 日志记录器
  • 数据库连接池
  • 缓存系统

创建型模式的选择指南

选择合适的创建型模式需要考虑多个因素,包括对象复杂度、创建逻辑、扩展性需求等。以下是一个决策框架,帮助你根据具体场景选择最合适的创建型模式:

mermaid

总结与实践建议

创建型模式为对象创建提供了灵活多样的解决方案,每种模式都有其适用场景和优缺点。在实际开发中,应根据项目需求和复杂度选择合适的模式:

  1. 优先使用简单工厂:对于简单场景,简单工厂模式实现简单,足够满足需求
  2. 考虑扩展性:当产品类型可能增加时,优先选择工厂方法或抽象工厂
  3. 复杂对象用建造者:需要分步构建或多种表示时,建造者模式是最佳选择
  4. 资源共享用单例:管理共享资源时,单例模式确保资源唯一和全局访问
  5. 创建成本高用原型:当对象创建成本高或需要动态类型时,原型模式更高效

通过合理应用这些创建型模式,可以显著提高代码的灵活性、可维护性和可扩展性。建议深入研究golang-design-pattern项目中的具体实现,结合实际场景进行实践。

要开始使用这些设计模式,可通过以下命令克隆项目:

git clone https://gitcode.com/gh_mirrors/go/golang-design-pattern

探索每个模式的实现代码和测试用例,理解其工作原理和应用方式,将这些模式灵活应用到你的项目中,提升代码质量和开发效率。

【免费下载链接】golang-design-pattern 设计模式 Golang实现-《研磨设计模式》读书笔记 【免费下载链接】golang-design-pattern 项目地址: https://gitcode.com/gh_mirrors/go/golang-design-pattern

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值