首页 > 其他分享 >Golang学习笔记_28——工厂方法模式

Golang学习笔记_28——工厂方法模式

时间:2025-01-20 22:04:14浏览次数:3  
标签:ConcreteProductB Product struct 28 笔记 工厂 Golang func type

Golang学习笔记_25——协程
Golang学习笔记_26——通道
Golang学习笔记_27——单例模式


文章目录


工厂方法模式

1. 介绍

工厂方法模式(Factory Method)是一种创建型设计模式,它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让类的实例化推迟到子类中进行

2. 优点

  1. 解耦:将对象的创建与使用分离,客户端不需要知道具体的类名。

  2. 扩展性:增加新的产品类时,只需添加相应的工厂类即可,符合开闭原则。

  3. 单一职责原则:将创建对象的代码封装在工厂中,职责单一。

3. 类图

  1. Product(产品接口):定义了产品的接口,所有具体产品都要实现这个接口。

  2. ConcreteProduct(具体产品):实现了Product接口的具体类。

  3. Creator(工厂接口):声明了工厂方法,用于返回一个Product对象。

  4. ConcreteCreator(具体工厂):实现了工厂接口,返回具体产品的实例。

    +-----------------+
    |     Product     |<----------------+
    +-----------------+                 |
    | + Use()         |                 |
    +-----------------+                 |
            ^                           |
            |                           |
    +-----------------+         +-----------------+
    | ConcreteProductA|         | ConcreteProductB|
    +-----------------+         +-----------------+
    | + Use()         |         | + Use()         |
    +-----------------+         +-----------------+

    +-----------------+
    |     Creator     |<----------------+
    +-----------------+                 |
    | + CreateProduct()|                |
    +-----------------+                 |
            ^                           |
            |                           |
    +-----------------+         +-----------------+
    | ConcreteCreatorA|         | ConcreteCreatorB|
    +-----------------+         +-----------------+
    | + CreateProduct()|        | + CreateProduct()|
    +-----------------+         +-----------------+

4. 实现

// Product 是产品接口
type Product interface {
	Use() string
}

// ConcreteProductA 是具体产品A
type ConcreteProductA struct{}

func (p *ConcreteProductA) Use() string {
	return "使用产品A"
}

// ConcreteProductB 是具体产品B
type ConcreteProductB struct{}

func (p *ConcreteProductB) Use() string {
	return "使用产品B"
}

// Factory 是工厂接口
type Factory interface {
	CreateProduct() Product
}

// ConcreteFactoryA 是具体工厂A
type ConcreteFactoryA struct{}

func (f *ConcreteFactoryA) CreateProduct() Product {
	return &ConcreteProductA{}
}

// ConcreteFactoryB 是具体工厂B
type ConcreteFactoryB struct{}

func (f *ConcreteFactoryB) CreateProduct() Product {
	return &ConcreteProductB{}
}

源码

// Product 是产品接口
type Product interface {
	Use() string
}

// ConcreteProductA 是具体产品A
type ConcreteProductA struct{}

func (p *ConcreteProductA) Use() string {
	return "使用产品A"
}

// ConcreteProductB 是具体产品B
type ConcreteProductB struct{}

func (p *ConcreteProductB) Use() string {
	return "使用产品B"
}

// Factory 是工厂接口
type Factory interface {
	CreateProduct() Product
}

// ConcreteFactoryA 是具体工厂A
type ConcreteFactoryA struct{}

func (f *ConcreteFactoryA) CreateProduct() Product {
	return &ConcreteProductA{}
}

// ConcreteFactoryB 是具体工厂B
type ConcreteFactoryB struct{}

func (f *ConcreteFactoryB) CreateProduct() Product {
	return &ConcreteProductB{}
}

func test() {
	// 创建具体工厂A
	factoryA := &ConcreteFactoryA{}
	// 使用工厂A创建产品A
	productA := factoryA.CreateProduct()
	// 使用产品A
	println(productA.Use())

	// 创建具体工厂B
	factoryB := &ConcreteFactoryB{}
	// 使用工厂B创建产品B
	productB := factoryB.CreateProduct()
	// 使用产品B
	println(productB.Use())
}

标签:ConcreteProductB,Product,struct,28,笔记,工厂,Golang,func,type
From: https://blog.csdn.net/LuckyLay/article/details/145270135

相关文章

  • OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?
    OpenEuler与CentOS的对比一、基本信息起源与背景:OpenEuler:由华为发起,后捐赠给开放原子开源基金会,旨在构建一个开放、多元化的云计算和边缘计算平台,以满足华为及其他企业的硬件和软件需求。CentOS:最初是基于RedHatEnterpriseLinux(RHEL)的源代码构建的社区发行版,为用......
  • 莫队套分块-学习笔记
    莫队套分块P4396[AHOI2013]作业题目翻译:给定一个长度为\(n\)的序列,\(m\)次询问,每一次给出\(l,r,a,b\)及求在区间\([l,r]\)间在值域\([a,b]\)的所有数的个数,和数的种数。算法理解:莫队套分块,显而易见就是在运用莫队的前提下,用分块来处理莫队的增减值。分块的复杂度......
  • YOLOv10-1.1部分代码阅读笔记-model.py
    model.pyultralytics\engine\model.py目录model.py1.所需的库和模块2.classModel(nn.Module): 1.所需的库和模块#UltralyticsYOLO......
  • Doris 2.1 Queries Acceleration -Tuning Plan学习笔记
    1OptimizingTableSchemaDesign1.1Case1:TableEngineSelection1.1.1Thequeryperformanceofthesetablemodels,frombesttoworst,is:Duplicate>MOW>MOR==Aggregate.1.2Case2:BucketColumnSelection1.2.1Selectingappropriatebucket......
  • Java初学者笔记-08、IO流
    I:负责把磁盘和网络中的数据读到程序内存中去。O:负责把程序内存中的数据写到网络或者磁盘中。按照流的内容,IO流分为字节流和字符流。字节流:最小单位是字节。适合操作所有类型的文件。比如音频、视频、图片文本等的复制,转移。字符流:只适合操作纯文本文件。比如读写txt,java文件......
  • AGC005做题笔记
    AtcoderGrandContest005A-STring题目大意有一个字符串\(X\),它的字符数是偶数。其中一半字符为"S",另一半字符为"T"。现执行以下操作\(10^{10000}\)次:在\(X\)中(连续)出现的ST子串中,删除最左边的一个。如果没有出现,则不做任何操作。找出\(X\)的最终长度。解......
  • AI大模型-提示工程学习笔记9-生成知识提示
    卷首语:我所知的是我自己非常无知,所以我要不断学习。写给AI入行比较晚的小白们(比如我自己)看的,大神可以直接路过无视了。有一种改进大语言模型(LLM)推理能力的技术:生成知识作为提示的一部分。这种方法由Liu等人(2022)提出,旨在通过让模型先生成相关知识,再将这些知识整合到推理过......
  • Python Playwright学习笔记(二)
    一、模拟手机playwright.devices可以配置模拟器。importasynciofromplaywright.async_apiimportasync_playwrightasyncdefrun(playwright):iphone_12=playwright.devices['iPhone12']browser=awaitplaywright.webkit.launch(headless=False)conte......
  • uos 开发笔记
    versionGLIBCXX_3.4.26notfound的问题解决一查看是否有这个库/lib64/libstdc++.so.6二查看这个库/lib64/libstdc++.so.6中的的GLIBCXX的支持的版本 经查看是环境里已经有这个库,并且是个软连接,软连接到libstdc++.so.6.0.19 查看这个库/lib64/libstdc++.so.6中的的GLIBCX......
  • Maui学习笔记-系统主题切换
    Maui提供了一种根据当前应用程序主题设置属性的机制,但是它不包含用于在UI中切换主题的组件,需要我们自行创建。创建项目 首先创建一个ThemeInfo类来存储应用程序主题对象及标题。这些对象会在Picker元素中显示。添加CommunityToolkit.Mvvm工具包,创建一个ThemeSettings主......