zoukankan      html  css  js  c++  java
  • Go --- 设计模式(工厂模式)

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

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

     
     
  • 相关阅读:
    python数据结构之字典
    Python数据结构之列表
    使用QrCode生成二维码
    JavaScript在不同环境下的全局对象
    记一次使用 removeEventListener 移除事件监听失败的经历
    Model、View、ViewModel结构以及全局视图模型注入器的说明
    MVVMLight介绍以及在项目中的使用
    WPF/Silverlight深度解决方案:(一)解锁被Storyboard束缚的关联属性
    进程发送消息
    .net4.0中wpf单例启动
  • 原文地址:https://www.cnblogs.com/mafeng/p/6924096.html
Copyright © 2011-2022 走看看