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

     
     
  • 相关阅读:
    Get-CrmSetting返回Unable to connect to the remote server的解决办法
    Dynamics 365中的常用Associate和Disassociate消息汇总
    Dynamics 365 Customer Engagement V9 活动源功能报错的解决方法
    Dynamics Customer Engagement V9版本配置面向Internet的部署时候下一步按钮不可点击的解决办法
    Dynamics 365检查工作流、SDK插件步骤是否选中运行成功后自动删除系统作业记录
    注意,更改团队所属业务部门用Update消息无效!
    Dynamics 365的审核日志分区删除超时报错怎么办?
    Dynamics 365使用Execute Multiple Request删除系统作业实体记录
    Dynamics 365的系统作业实体记录增长太快怎么回事?
    Dynamics CRM日期字段查询使用时分秒的方法
  • 原文地址:https://www.cnblogs.com/mafeng/p/6924096.html
Copyright © 2011-2022 走看看