天天學設計模式:簡單工廠模式

1、面向對象編程編程

一、可維護性架構

  當往後代碼須要修改邏輯的時候,只須要修改某些類或者增長某些類,對主程序和大部分代碼不須要修改,體現爲可維護性。函數

二、可複用性學習

  將必定的代碼進行封裝,在多處能夠重複使用。spa

三、可擴展性對象

  當增長新的功能模塊時,只須要增長某些代碼,對總體代碼架構不須要作太多修改。blog

四、高靈活性繼承

  經過封裝、繼承、多態把程序的耦合度下降,耦合度下降後,使代碼的使用更加靈活,更容易修改,易於複用。接口

 

2、簡單工廠模式的實現——以計算器功能爲例字符串

  學習的來源是程傑的《大話數據模式》,書中的例子比較易懂,故事也具備連續性。本文的語言繼續使用我最近學習的Go語言。

  首先先寫一個計算器操做的接口:

type Operation interface {
    GetResult(numberA float32, numberB float32) (float32, error)
}

  其中有一個函數GetResult(),接收兩個float32的參數numberA和numberB,返回一個float32的結果和error的錯誤格式(多返回值是Go語言的特性)。同時Go語言的非侵入式繼承也規定了,只要某個類實現了接口的全部方式,就等因而實現了該接口。

  下面咱們寫最基本的加減乘除類:

// 加法操做類
type OperationAdd struct {
}

// 實現GetResult方法
func (o *OperationAdd) GetResult(numberA float32, numberB float32) (float32,error) {
    return numberA + numberB, nil
}

// 減法操做類
type OperationSub struct {
}

// 實現GetResult方法
func (o *OperationSub) GetResult(numberA float32, numberB float32) (float32,error) {
    return numberA - numberB, nil
}

// 乘法操做類
type OperationMul struct {
}

// 實現GetResult方法
func (o *OperationMul) GetResult(numberA float32, numberB float32) (float32,error) {
    return numberA * numberB, nil
}

// 除法操做類
type OperationDiv struct {
}

// 實現GetResult方法
func (o *OperationDiv) GetResult(numberA float32, numberB float32) (float32,error) {
    if numberB == 0 {
        return 0, nil
    }
    return numberA / numberB, nil
}

  各方法都實現了GetResult()方法後,已是實現了Operation接口。

  由面向對象多態的性質,咱們編寫簡單工廠類

// 操做工廠類
type OperationFactory struct {

}

func (o *OperationFactory) CreateOperation(operation string) (oper Operation) {
    switch operation {
    case "+":
        oper = new(OperationAdd)
    case "-":
        oper = new(OperationSub)
    case "*":
        oper = new(OperationMul)
    case "/":
        oper = new(OperationDiv)
    }
    return
}

  oper是Operation類型,因爲OpeartionAdd、OpeartionSub、OpeartionMul和OpeartionDiv都實現了Opeartion,因此能夠賦值給oper。工廠類就提供了一個方法,根據傳入的字符串,返回適合的對象。

  下面編寫主程序:

func main() {
    factory := new(OperationFactory)

    operation := factory.CreateOperation("+")
    fmt.Println(operation.GetResult(6,2))

    operation = factory.CreateOperation("-")
    fmt.Println(operation.GetResult(6,2))

    operation = factory.CreateOperation("*")
    fmt.Println(operation.GetResult(6,2))
    
    operation = factory.CreateOperation("/")
    fmt.Println(operation.GetResult(6,2))
}

  可見,一樣的operation對象,調用GetResult()方法,獲得的結果不一樣,形成結果不一樣的緣由在於工廠對你傳入的"+"、"-"、"*"和"/"進行判斷返回了不一樣的對象。

  這樣,下次咱們須要修改需求或者增長需求的時候,就只須要增長或者修改部分類的代碼就能夠了。

  以增長平方操做爲例,咱們首先須要新寫一個OperationPower類,實現Operation接口。在OperationFactory工廠類中增長case判斷,再在主程序中添加操做即可。整個代碼的耦合度大大下降,靈活性也獲得了提升。

相關文章
相關標籤/搜索