[03]Go设计模式:工厂模式(Factory Pattern)
工厂模式
一、简介
工厂模式(Factory Pattern)是软件设计中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。在每增加一种类型时,只需要修改工厂函数即可。 在产品较多时,工厂函数代码逻辑将会非常复杂。
二、代码
package main
import "fmt"
type Animal interface {
CanFly() bool
}
type Dog struct {
Name string
Age int
}
func NewDog(name string, age int) *Dog {
return &Dog{
Name: name,
Age: age,
}
}
func(d *Dog)CanFly() bool{
fmt.Printf("%s can not fly\n", d.Name)
return false
}
type Cat struct {
Name string
Age int
}
func NewCat(name string, age int) *Cat {
return &Cat{
Name: name,
Age: age,
}
}
func(c *Cat)CanFly() bool{
fmt.Printf("%s can not fly\n", c.Name)
return false
}
func Factory(name string, age int) Animal {
if name == "Cat" {
return NewCat(name, age)
}else{
return NewDog(name, age)
}
}
func main(){
d1 := Factory("Dog", 1)
d1.CanFly()
c1 := Factory("Cat", 1)
c1.CanFly()
}
在写Factory遇到一个问题:
package main
import "fmt"
type Animal interface {
CanFly() bool
}
type Cat struct {
Name string
Age int
}
func NewCat(name string, age int) Cat {
return Cat{
Name: name,
Age: age,
}
}
func(c *Cat)CanFly() bool{
//修改只需要将c *Cat修改为c Cat即可
fmt.Printf("%s can not fly\n", c.Name)
return false
}
func Factory(name string, age int) Animal {
if name == "Cat" {
return NewCat(name, age) //这一行一直报错
}
return nil
}
method has pointer receiver, 通过参考资料2的链接解决了问题。一个struct虽然可以通过值类型和引用类型两种方式定义方法,但是不通的对象类型对应了不同的方法集:
Values | Methods Receivers |
---|---|
T | (t T) |
*T | (t T) and (t *T) |
值类型的对象只有(t T) 结构的方法,虽然值类型的对象也可以调用(t *T) 方法,但这实际上是Golang编译器自动转化成了&t的形式来调用方法,并不是表明值类型的对象拥有该方法。
换一个维度来看上面的表格可能更加直观:
Values | Methods Receivers |
---|---|
(t T) | T and *T |
(t *T) | *T |
这就意味着指针类型的receiver 方法实现接口时,只有指针类型的对象实现了该接口。
三、参考资料
1、 https://www.runoob.com/design-pattern/factory-pattern.html
2、 https://stackoverflow.com/questions/33936081/golang-method-with-pointer-receiver
[03]Go设计模式:工厂模式(Factory Pattern)的更多相关文章
- 设计模式 - 工厂模式(factory pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...
- 23种设计模式--工厂模式-Factory Pattern
一.工厂模式的介绍 工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...
- 设计模式 - 出厂模式(factory pattern) 详细说明
出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- 【设计模式】工厂模式 Factory Pattern
1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...
- JAVA设计模式之工厂模式—Factory Pattern
1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...
- 创建型模式篇(工厂模式Factory Pattern)
一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...
- [设计模式]工厂模式factory
参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...
- 大话设计模式--工厂模式 factory -- C++实现实例
实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
随机推荐
- 启用Microsoft loopback Adapte
开始▶控制面板▶系统 系统▶设备管理器 此时,点击操作的菜单是没有有用子菜单的,需要点击一下网络适配器. 再点击操作▶添加过时硬件 添加硬件向导▶下一步 安装我手动从列表选择的硬件 ...
- How Open Source Became The Default Business Model For Software
https://www.forbes.com/sites/forbestechcouncil/2018/07/16/how-open-source-became-the-default-busines ...
- tf.logging.set_verbosity
tf.logging.set_verbosity (tf.logging.INFO) 作用:将 TensorFlow 日志信息输出到屏幕
- php+tcpdf如何把生成的pdf文件保存在服务端
tcpdf组件目前应用得非常广泛,但是对于如何把生成的pdf文件自动保存在服务端却很少有人提及.让我们先来看看标准输出代码: //服务器存档模式 $pdf->Output('output.p ...
- 解决最新版fitnesse无法运行测试用例的问题
用fitnesse-standalone.jar这个jar包时 运行测试用例会报错,显示IOException:can not run program:”c:\program files\java\j ...
- spring boot+Quartz+数据库存储
SpingBoot+Quartz+数据库存储 1.Spring整合Quartz 2.读取数据库中表达式启动定时任务1(每5s执行) 3.更改定时任务状态(启用/禁用),定时任务1停止 4.读取数据库中 ...
- SpringCloud组件Eureka
什么是微服务架构 架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异步通信,独立部署)是分布式概念的跟严格执行SOA到微服务架构的演进过程作用:各服务 ...
- 微信小程序路由带参
通过url带参传递 wxml <navigator url="../user/user?id={{item.id}}&name={{item.name}}">点 ...
- 如何用Windbg从dump获取计算机名、主机名
对内存转储时发生的事情有一定的了解是非常重要的.这有助于您确定要执行哪些WinDbg命令,并为您提供一些有关如何解释这些命令输出的上下文.我正在查看一个服务器的内存转储,该服务器存在性能问题.我在内存 ...
- 集成omnibus-ctl+ chef 制作一个可配置的软件包
前边有写过使用omnibus-ctl 制作软件包的,但是当时没有集成chef,只有一个空壳子,实际上omnibus-ctl 已经内置 了对于chef 的操作(但是我们还需要在添加一个依赖),以下简单说 ...