工厂模式

一、简介

工厂模式(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)的更多相关文章

  1. 设计模式 - 工厂模式(factory pattern) 具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...

  2. 23种设计模式--工厂模式-Factory Pattern

    一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...

  3. 设计模式 - 出厂模式(factory pattern) 详细说明

    出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式 ...

  4. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  5. 【设计模式】工厂模式 Factory Pattern

    1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...

  6. JAVA设计模式之工厂模式—Factory Pattern

    1.工厂模式简介 工厂模式用于对象的创建,使得客户从具体的产品对象中被解耦. 2.工厂模式分类 这里以制造coffee的例子开始工厂模式设计之旅. 我们知道coffee只是一种泛举,在点购咖啡时需要指 ...

  7. 创建型模式篇(工厂模式Factory Pattern)

    一.工厂模式(Factory Pattern) 1.定义: 在软件系统,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.提供一种封 ...

  8. [设计模式]工厂模式factory

    参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...

  9. 大话设计模式--工厂模式 factory -- C++实现实例

    实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...

随机推荐

  1. StringTokenizer字符串分解器

    示例: StringTokenizer st = new StringTokenizer(key, ",", false); while (st.hasMoreTokens()) ...

  2. 使用vue-cli3搭建项目过程

    一.搭建前准备 node.js版本为8.9+: 安装模块:npm install -g n // 安装模块 这个模块是专门用来管理node.js版本的: 若原先已经安装,则更细模块:n stable ...

  3. NOIP 2018 考前须知

    Day0Day0Day0来水一发 Created with Raphaël 2.2.0开始考试浏览题面(3遍),注意数据范围初步判定难度,先易后难15分钟左右想正解实在想吃不出写暴力,NOIP部分分很 ...

  4. chrome调试微信,app中H5网页的方法!

      调试微信,app中H5网页大概有如下几个方法: (1).我们可以直接把网页的url放在chrome浏览器中进行调试.(不涉及微信登录) (2).我们可以把网页的url放在微信开发者工具中进行调试. ...

  5. 【loj2262】【CTSC2017】网络

    题目 一颗\(n\)个点的树,求加入一条边点之后两点间最长距离的最小值 : \(n \le 100000\) ; 题解 首先加入边的两个端点一定在直径上面,先\(dfs\)拎出直径来讨论(下标只代表直 ...

  6. Python 企业面试题集锦之Python基础

    △字符串.列表.元组.字典每个常用的5个方法? 字符串: 字符串用单引号(')或双引号(")括起来,不可变. s.strip(c):去除空格或指定的字符c:lstrip/rstrip: s. ...

  7. 第09组 团队Git现场编程实战

    组长博客链接 1.团队分工 团队成员 分工明细 王耀鑫 博客撰写,数据处理 陈志荣 前端界面,前端功能实现 陈超颖 前端界面,前端功能实现 沈梓耀 前端界面,前端功能实现 林明镇 数据处理 滕佳 前端 ...

  8. vue中父级与子组件生命周期的先后顺序

    1.vue的生命周期 2.views/createrCustormer.vue为父级     <template>     <expressService />   </ ...

  9. Ubuntu 安装MySQL报共享库找不到

    错误信息1: ./mysqld: error : cannot open shared object file: No such file or directory 解决办法:安装改库 # apt-g ...

  10. 20189220 余超《Linux内核原理与分析》第七周作业

    分析Linux内核创建一个新进程的过程 基础知识概括 操作系统内核实现操作系统的三大管理功能,即进程管理功能,内存管理和文件系统.对应的三个抽象的概念是进程,虚拟内存和文件.其中,操作系统最核心的功能 ...