設計模式-簡單工廠模式(Go實現)

 

目錄

  • 簡單工廠模式
  • 需求
  • 修改前
    • 錯誤設計
    • 代碼
  • 修改後
    • 正確設計
    • 代碼實現
  • 測試
    • 測試代碼
    • 測試結果
  • 總結
    • 適用場景
    • 優勢
    • 缺點

 


簡單工廠模式

簡單工廠模式並不屬於GoF的23個經典設計模式,但一般將它做爲學習其餘工廠模式的基礎,它的設計思想很簡單,其基本流程以下:設計模式

首先將須要建立的各類不一樣對象(例如各類不一樣的Food對象)的相關代碼封裝到不一樣的類中,這些類稱爲具體產品類,而將它們公共的代碼進行抽象和提取後封裝在一個抽象產品類中,每個具體產品類都是抽象產品類的子類;而後提供一個工廠類用於建立各類產品,在工廠類中提供一個建立產品的工廠方法,該方法能夠根據所傳入的參數不一樣建立不一樣的具體產品對象;客戶端只需調用工廠類的工廠方法並傳入相應的參數便可獲得一個產品對象。ide

需求

快餐店的食物,目前有漢堡,粥,須要向顧客展現價格。學習

修改前

錯誤設計

在這裏插入圖片描述

代碼

package SimpleFactory

import "fmt"

type Food struct {
	price int
	type_ string
}

func NewFood(t string) *Food {
	if t == "hamburger"{
		return &Food{
			type_: t,
			price: 13,
		}
	}else if t == "porridge"{
		return &Food{
			type_: t,
			price: 8,
		}
	}
	return nil
}

func (f Food)Display()  {
	if f.type_ == "hamburger"{
		fmt.Println("I'm Hamburger, price is ",f.price)
	}else if f.type_ == "porridge"{
		fmt.Println("I'm Porridge, price is ",f.price)
	}
}

能夠看出有幾個問題測試

  1. 這個類有不少if…else,代碼冗長
  2. 職責太重,食物相關的全部東西都放在了一塊兒
  3. 違反開閉原則,添加一款新的食物時就須要修改這個類
修改後

正確設計

在這裏插入圖片描述

代碼實現

package SimpleFactory

import (
	"fmt"
)

type Foods interface {
	Display()
}

type Hamburger struct {
	price int
}

func (h Hamburger) Display() {
	fmt.Println("I'm Hamburger, price is ",h.price)
}

type Porridge struct {
	price int
}

func (p Porridge) Display() {
	fmt.Println("I'm Porridge, price is ",p.price)
}

type FoodsFactory struct {

}

func (f FoodsFactory)GetFood(name string) Foods {
	switch name {
	case "hamburger":
		return & Hamburger{price: 10}
	case "porridge":
		return &Porridge{price: 8}
	default:
		return nil
	}
}

相對於修改前,增長一個食品時只須要新增一個類,實現Display方法便可,不對原來的漢堡和粥的代碼修改,維護工廠類的GetFood方法便可。
簡化:去除工廠類,將工廠方法(GetFood)與抽象類/接口(Foods)合併設計

測試

測試代碼

package SimpleFactory

import (
	"fmt"
	"testing"
)

func TestWrong(t *testing.T) {
	ham := NewFood("hamburger")
	ham.Display()
	por := NewFood("porridge")
	por.Display()
	wrong := NewFood("not exist")
	fmt.Println(wrong)
}

func TestSimple(t *testing.T) {
	f := FoodsFactory{}
	ham := f.GetFood("hamburger")
	ham.Display()
	por := f.GetFood("porridge")
	por.Display()
	wrong := f.GetFood("not exist")
	fmt.Println(wrong)
}

測試結果

=== RUN TestSimple
I’m Hamburger, price is 10
I’m Porridge, price is 8

— PASS: TestSimple (0.00s)
PASS對象

總結

適用場景

  • 工廠類負責建立的對象比較少,不會形成工廠方法中的業務邏輯太過複雜。
  • 客戶端只知道傳入工廠類的參數,並不關心如何建立對象。

優勢

  • 簡單工廠模式實現了對象建立和使用的分離。工廠類包含必要的判斷邏輯,能夠決定在何時建立哪個產品類的實例,客戶端能夠僅僅使用產品。
  • 簡單工廠模式能夠在必定程度減小使用者的記憶量。客戶端無須知道所建立的具體產品類的類名,只須要知道具體產品類所對應的參數便可。

缺點

  • 因爲工廠類集中了全部產品的建立邏輯,職責太重,一旦不能正常工做,整個系統都要受到影響。
  • 使用簡單工廠模式勢必會增長系統中類的個數,增長了系統的複雜度和理解難度。
  • 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較多時,有可能形成工廠邏輯過於複雜,不利於系統的擴展和維護。
相關文章
相關標籤/搜索