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())
}
相关推荐
齐生121 小时前
iOS 知识点 - 渲染机制、动画、卡顿小集合
笔记
用户962377954481 天前
VulnHub DC-1 靶机渗透测试笔记
笔记·测试
willow2 天前
Axios由浅入深
设计模式·axios
齐生12 天前
iOS 知识点 - IAP 是怎样的?
笔记
tingshuo29173 天前
D006 【模板】并查集
笔记
tingshuo29174 天前
S001 【模板】从前缀函数到KMP应用 字符串匹配 字符串周期
笔记
七月丶4 天前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞4 天前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼4 天前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式