• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go---设计模式(工厂模式)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

package calc

type CalcSuper interface {
    SetData(data ...interface{})
    CalcOperate() float64
}

 

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

package calc

import "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 calc

import "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 calc

type 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 main

import (
    . "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章:创建 的相关知识。讲的非常的全面。

 
 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap