欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > Golang学习笔记_28——工厂方法模式

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

2025/1/25 3:11:52 来源:https://blog.csdn.net/LuckyLay/article/details/145270135  浏览:    关键词:Golang学习笔记_28——工厂方法模式

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


文章目录

    • 工厂方法模式
      • 1. 介绍
      • 2. 优点
      • 3. 类图
      • 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. 实现

// 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() {// 创建具体工厂AfactoryA := &ConcreteFactoryA{}// 使用工厂A创建产品AproductA := factoryA.CreateProduct()// 使用产品Aprintln(productA.Use())// 创建具体工厂BfactoryB := &ConcreteFactoryB{}// 使用工厂B创建产品BproductB := factoryB.CreateProduct()// 使用产品Bprintln(productB.Use())
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com