成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go開源庫、大項目的公共包,是這么用建造者模式的

開發 前端
我們給 DB 連接池加一個建造者模式,這樣在設置每個配置化參數的時候就可以對參數進行一步檢查,避免直接 new 連接池對象,再給每個屬性賦值時都加判斷,把每個參數的校驗內聚到參數自己的建造者步驟里。

建造者模式,也有翻譯成生成器模式的,大家看到后知道他們是一個東西,都是Builer Pattern翻譯過來的就行。它是一種對象構建模式,是將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 那么什么情況下適合使用建造模式呢?

  • 當要構建的對象很大并且需要多個步驟時,使用構建器模式,有助于減小構造函數的大小。

我們先來看下其他語言里的 Builder,再看看 Go 怎么使用,進行個對比。

Java 的Builder

如果你是寫過Java程序一定對下面這類代碼很熟悉。

Coffee.builder().name("Latti").price("30").build()

當然,自己給Coffee類加上構建模式,還是需要寫不少額外的代碼,得給 Coffee 類加一個靜態內部類 CoffeeBuilder,用CoffeeBuilder,去建造Coffee類的對象。

類、靜態內部類傻傻分不清?可以看下小弟的 Java 文

光會面向對象基礎做不了項目,還得掌握這些進階知識

不過Java?里有一個lombok?包,只要引入這個包再在實體類加上@Builder注解,就可以使用建造模式構建對象啦。

import lombok.Builder;

@Builder
public class Coffee extends BaseEntity implements Serializable {
private String name;

private Long price;

......
}

Go 里使用Builder

那在Go?里面要怎么實現Builder模式呢?仿照上面這個模式,我們可以這樣:

假設我們要在項目里搞個 DB 鏈接池,連接池提供了很多配置化的參數。

type DBPool struct {
dsn string
maxOpenConn int
maxIdleConn int
...
maxConnLifeTime time.Duration
}

我們給 DB 連接池加一個建造者模式,這樣在設置每個配置化參數的時候就可以對參數進行一步檢查,避免直接 new 連接池對象,再給每個屬性賦值時都加判斷,把每個參數的校驗內聚到參數自己的建造者步驟里。

type DBPoolBuilder struct {
DBPool
err error
}

func Builder () *DBPoolBuilder {
b := new(DBPoolBuilder)
// 設置 DBPool 屬性的默認值
b.DBPool.dsn = "127.0.0.1:3306"
b.DBPool.maxConnLifeTime = 1 * time.Second
b.DBPool.maxOpenConn = 30
return b
}

func (b *DBPoolBuilder) DSN(dsn string) *DBPoolBuilder {
if b.err != nil {
return b
}
if dsn == "" {
b.err = fmt.Errorf("invalid dsn, current is %s", dsn)
}

b.DBPool.dsn = dsn
return b
}

func (b *DBPoolBuilder) MaxOpenConn(connNum int) *DBPoolBuilder {
if b.err != nil {
return b
}
if connNum < 1 {
b.err = fmt.Errorf("invalid MaxOpenConn, current is %d", connNum)
}

b.DBPool.maxOpenConn = connNum
return b
}

func (b *DBPoolBuilder) MaxConnLifeTime(lifeTime time.Duration) *DBPoolBuilder {
if b.err != nil {
return b
}
if lifeTime < 1 * time.Second {
b.err = fmt.Errorf("connection max life time can not litte than 1 second, current is %v", lifeTime)
}

b.DBPool.maxConnLifeTime = lifeTime
return b
}

func (b *DBPoolBuilder) Build() (*DBPool, error) {
if b.err != nil {
return nil, b.err
}
if b.DBPool.maxOpenConn < b.DBPool.maxIdleConn {
return nil, fmt.Errorf("max total(%d) cannot < max idle(%d)", b.DBPool.maxOpenConn, b.DBPool.maxIdleConn)
}
return &b.DBPool, nil
}

接下來就可以使用構建模式創造DBPool類型的對象了。

package main 

import "xxx/dbpool"

func main() {
dbPool, err := dbpool.Builder().DSN("localhost:3306").MaxOpenConn(50).MaxConnLifeTime(0 * time.Second).Build()
if err != nil {
fmt.Println(err)
}
fmt.Println(dbPool)
}

另外在建造者過程的每個參數步驟里,我們都借用了之前提到的處理 Go Error 的方式,把在外部調用時的錯誤判斷,分散到了每個步驟里。

這么一來有從觀感上覺得確實比定義一個參數巨多的 DBPool 構造函數要好一點。你覺得呢?

Go 里邊還有一個函數時編程風格,利用的是函數的可變參數 (variadic parameters) ,這種編程模式就是 Option 模式。

責任編輯:武曉燕 來源: 網管叨bi叨
相關推薦

2013-04-23 15:31:28

大項目

2015-07-13 11:09:06

谷歌改變世界

2011-04-28 08:59:20

項目框架

2012-04-12 14:36:47

js項目合作

2020-10-20 13:33:00

建造者模式

2021-10-26 00:21:19

設計模式建造者

2011-04-07 15:09:48

項目管理項目

2021-01-21 05:34:14

設計模式建造者

2021-04-14 09:02:22

模式 設計建造者

2020-10-15 16:27:26

騰訊TencentOS tTKEStack

2014-02-28 13:27:08

程序員代碼

2024-12-16 00:50:56

2011-07-14 14:46:46

設計模式

2021-06-10 19:09:05

模式代碼建造者

2021-05-11 08:54:59

建造者模式設計

2022-11-06 23:17:23

Go語言項目

2024-12-17 09:14:48

項目http 庫API

2024-02-19 08:38:34

建造者模式Android設計模式

2022-04-27 08:24:04

項目管理群管理管控

2019-01-21 08:00:00

谷歌開源數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩日韩日韩日韩日韩日韩日韩 | 国产91在线播放 | 成人黄色电影在线观看 | 国产在线a | 精品久久一区 | 欧美一区二区久久 | 国产一区二区中文字幕 | 在线播放亚洲 | 99精品一区二区三区 | 久久免费资源 | 国产高清一区二区三区 | 国产丝袜一区二区三区免费视频 | 成人在线观看免费 | 中文字幕成人 | 中文字幕精品视频 | 亚洲一区日韩 | 羞羞视频网站 | 中文在线a在线 | 日日天天 | 欧美专区在线视频 | 日本精品一区二区 | 日本一区二区高清视频 | 久久久夜色精品亚洲 | 国产精品爱久久久久久久 | a视频在线| 中文字幕成人在线 | 国产精品久久久久不卡 | 国产成人精品一区二三区在线观看 | 91免费看片| 欧美电影在线观看网站 | 911网站大全在线观看 | 一区二区三区福利视频 | 中文字幕国产日韩 | 一区二区三区视频在线观看 | 成人在线播放网站 | 日韩高清国产一区在线 | 美美女高清毛片视频免费观看 | 99福利在线观看 | 亚州综合一区 | 国产女人与拘做受视频 | 97av在线|