简易工厂主要是用来解决对象“创建”的问题。以下的例子取自《大话设计模式》中第一章,实现一个可扩展的“计算器”。当增加新的功能时,并不需改动原来已经实现的算法。由于是简易工厂,所以我们还是需要对工厂类进行相应修改。

1.首先,我们定义一个计算的接口

package calctype CalcSuper interface {SetData(data ...interface{})CalcOperate() float64 }

2.接下来,我们实现这个接口的两个实现类,分别是加法和减法 
加法,就是用两个数来相加:)

package calcimport "fmt"type Add struct { Num1 float64 Num2 float64 } func NewAdd() *Add { instance := new(Add) return instance } func (a *Add) SetData(data ...interface{}) { if len(data) != 2 { fmt.Println("error,Need two parameters ") return } if _, ok := data[0].(float64); !ok { fmt.Println("error,Need float64 parameters ") return } if _, ok := data[1].(float64); !ok { fmt.Println("error,Need float64 parameters ") return } a.Num1 = data[0].(float64) a.Num2 = data[1].(float64) } func (a Add) CalcOperate() float64 { return a.Num1 + a.Num2 } 

减法,就是把两个数相减:),我感觉我好冷。。。

package calcimport "fmt"type Subtraction struct { Num1 float64 Num2 float64 } func NewSubtraction() *Subtraction { instance := new(Subtraction) return instance } func (a *Subtraction) SetData(data ...interface{}) { if len(data) != 2 { fmt.Println("error,Need two parameters ") return } if _, ok := data[0].(float64); !ok { fmt.Println("error,Need float64 parameters ") return } if _, ok := data[1].(float64); !ok { fmt.Println("error,Need float64 parameters ") return } a.Num1 = data[0].(float64) a.Num2 = data[1].(float64) } func (a Subtraction) CalcOperate() float64 { return a.Num1 - a.Num2 } 

3.下面到了大功告成的时候了,定义简易工厂,来实例化这两个类

package calctype CalcFactory struct {
}func NewCalcFactory() *CalcFactory {instance := new(CalcFactory) return instance } func (f CalcFactory) CreateOperate(opType string) CalcSuper { var op CalcSuper switch opType { case "+": op = NewAdd() case "-": op = NewSubtraction() default: panic("error ! dont has this operate") } return op }

在这个简易工厂,我们只传入相应的运算方式,如“+”,“-”,用来创建相关的运算策略。它会返回一个运算接口的实例,当我们得到这个实例,就能调用里面的方法进行运算了。

4.测试

// 简易工厂模式 project main.go
package mainimport (. "calc""fmt"
)func main() {factory := NewCalcFactory()op := factory.CreateOperate("+") op.SetData(1.0, 2.0) fmt.Println(op.CalcOperate()) op = factory.CreateOperate("-") op.SetData(1.0, 2.0) fmt.Println(op.CalcOperate()) /* 输出:3 -1 */ }

现在,我们的简易工厂模式就实现好了,当我们需要添加乘法运算,我们不必再修改或者编译已经完成的加法和减法运算。我们只需要添加乘法相应的结构,并且在factory中加上一个新的switch分支,就可以完成乘法了。

因为Go语言中不允许存在抽象类,这使得我实现了一个非常诡异的函数SetData(data …interface{})。它可以传入多个任意对象,用来设置我们结构中需要的数据。这只是一个示例,具体简易工厂有什么其它作用,可以参考《重构与模式》中第6章:创建 的相关知识。讲的非常的全面。

Go --- 设计模式(工厂模式)相关推荐

  1. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  2. Java设计模式-工厂模式(2)工厂方法模式

    在Java设计模式-工厂模式(1)简单工厂模式 中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而"工厂方法模式"是对简单工厂模式的进一步抽象化,其好处是可以使系统在不 ...

  3. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  4. 设计模式---工厂模式

    设计模式---工厂模式 工厂方法模式 概述:工厂方法模式中抽象工厂负责定义创建对象的接口,具体创建工作由继承抽象工厂的具体类实现. 优点:客户端不需要再负责对象的创建,从而明确了各个类的职责,如果有新 ...

  5. java设计模式工厂模式_Java中的工厂设计模式

    java设计模式工厂模式 Welcome to the Factory Design Pattern in Java tutorial. Factory Pattern is one of the C ...

  6. java设计模式工厂模式_Java中的复合设计模式

    java设计模式工厂模式 Composite pattern is one of the Structural design pattern. Composite design pattern is ...

  7. java设计模式工厂模式_Java中的桥梁设计模式

    java设计模式工厂模式 Today we will look into Bridge Design Pattern in java. When we have interface hierarchi ...

  8. java设计模式工厂模式_Java中的外观设计模式

    java设计模式工厂模式 Facade Design Pattern is one of the Structural design patterns (such as Adapter pattern ...

  9. 设计模式-工厂模式(学习)

    设计模式-工厂模式(学习) 在程序的世界里,就像射雕英雄传一样,我们的技能就像是武功一样,我们只有不断去学习练习才能有机会像郭靖一样成为"天下第一". 我认为技能和武功是很类似的, ...

  10. 设计模式-工厂模式的3中不同实现[JAVA]

    设计模式-工厂模式的3中不同实现[JAVA] 工厂模式简介 In Factory pattern, we create object without exposing the creation log ...

最新文章

  1. WP8:Unity3D之间的值传递
  2. linux硬盘目录下,Linux 新添加的硬盘格式化并挂载到目录下
  3. Request参数值自动去空格
  4. list 索引 java_如何在Java中保持List索引的固定
  5. 切换表达式到Java吗?
  6. fedora下配置ipv6 dns服务器
  7. 白话经典算法系列之一 冒泡排序的三种实现
  8. 使用Java来格式化时间
  9. golang mysql连接池原理_redis mysql 连接池 之 golang 实现
  10. java property类_Java之Property类使用
  11. AVA + Spectron + JavaScript 对 JS 编写的客户端进行自动化测试
  12. 【数学建模】基于matlab计划生育政策调整对人口数量、结构及其影响的研究【含Matlab源码 749期】
  13. ios html清除缓存图片,iOS 清理文件缓存(示例代码)
  14. 软考论文写作攻略,让你轻松拿高分!
  15. 【Autoware自动驾驶-开源项目实践】大家快来入门体验啦
  16. JConsole使用教程
  17. 注塑机结构及辅助设备详解
  18. 构建自定义安全令牌服务
  19. [Flutter]微信分享并从分享链接跳回APP指定页面
  20. JVM上篇(13):GC分类器

热门文章

  1. 朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别
  2. Tensorflow mnist 数据集测试代码 + 自己下载数据
  3. 违反计算机网络安全如何处罚,网络信息安全知识:违反治安管理行为的处罚包括()。...
  4. java web自定义监听器_Android自定义监听器Listener(自定义Java Callback回调事件)
  5. PHP里switch用法举例,PHP Switch语句的功能实例
  6. ubuntu利用apt-get卸载软件
  7. python的range()函数用法
  8. arg是什么函数_java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪...
  9. 计算机设备采购申请,办公室采购电脑请示报告
  10. 【PHPWord】页面添加图片水印