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

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


文章目录

    • 工厂方法模式
      • [1. 介绍](#1. 介绍)
      • [2. 优点](#2. 优点)
      • [3. 类图](#3. 类图)
      • [4. 实现](#4. 实现)
    • 源码

工厂方法模式

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. 实现

go 复制代码
// 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{}
}

源码

go 复制代码
// 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())
}
相关推荐
张永清-老清14 分钟前
每周读书与学习->JMeter主要元件详细介绍(一)配置元件
学习·jmeter·性能调优·jmeter性能测试·性能分析·干货分享
驰羽20 分钟前
[GO]golang接口入门:从一个简单示例看懂接口的多态与实现
开发语言·后端·golang
狮智先生29 分钟前
【学习笔记】利用meshlab进行曲面的质量检查
经验分享·笔记·课程设计·几何学
鼾声鼾语1 小时前
grootN1 grootN1.5 gr00t安装方法以及使用(学习)
学习·angular.js·simulink·isaacsim·isaaclab
Meteors.1 小时前
23种设计模式——访问者模式 (Visitor Pattern)
设计模式·访问者模式
MYX_3092 小时前
第七章 完整的模型训练
pytorch·python·深度学习·学习
Vallelonga2 小时前
Rust 设计模式 Marker Trait + Blanket Implementation
开发语言·设计模式·rust
新子y2 小时前
【小白笔记】岛屿数量
笔记·python
Larry_Yanan2 小时前
QML学习笔记(四十三)QML与C++交互:上下文属性暴露
c++·笔记·qt·学习·ui·交互
励志成为美貌才华为一体的女子2 小时前
pdf解析工具---Miner-u 本地部署记录
学习·pdf