手撸golang 创立型设计模式 建造者模式

缘起

最近温习设计模式
拜读谭勇德的<<设计模式就该这样学>>
本系列笔记拟采纳golang练习之

建造者模式

建造者模式(Builder Pattern)将一个简单对象的构建过程与它的示意拆散,使得同样的构建过程能够创立不同的示意,属于创立型设计模式。
_

场景

  • 某业务零碎, 心愿应用SQLQuery类动静结构简单SQL查问语句
  • SQLQuery类的各种属性组合状况很多, 因而创立SQLQueryBuilder作为SQLQuery的建造者

builder_test.go

测试用例

package patternsimport (    "fmt"    bd "learning/gooop/creational_patterns/builder"    "testing")func Test_Builder(t *testing.T) {    builder := bd.NewSQLQueryBuilder()    builder = builder.WithTable("product")    builder = builder.AddField("id").AddField("name").AddField("price")    builder = builder.AddCondition("enabled=1")    builder = builder.WithOrderBy("price desc")    query := builder.Build()    fmt.Println(query.ToSQL())}

测试输入

$ go test -v builder_test.go === RUN   Test_Builderselect id,name,price from product where enabled=1 order by price desc--- PASS: Test_Builder (0.00s)PASSok      command-line-arguments  0.002s

ISQLQuery.go

定义SQL查问表达式的接口

package buildertype ISQLQuery interface {    ToSQL() string}

ISQLQueryBuilder.go

定义SQL查问表达式的建造者接口, 该接口定义了一系列步骤去创立简单查问语句

package buildertype ISQLQueryBuilder interface {    WithTable(table string) ISQLQueryBuilder    AddField(field string) ISQLQueryBuilder    AddCondition(condition string) ISQLQueryBuilder    WithOrderBy(orderBy string) ISQLQueryBuilder    Build() ISQLQuery}

tSQLQuery.go

tSQLQuery实现了ISQLQuery接口, 依据各种参数生成简单SQL语句

package builderimport "strings"type tSQLQuery struct {    table string    fields []string    conditions []string    orderBy string}func newSQLQuery() *tSQLQuery {    return &tSQLQuery{        table:         "",        fields:     make([]string, 0),        conditions: make([]string, 0),        orderBy:    "",    }}func (me *tSQLQuery) ToSQL() string {    b := &strings.Builder{}    b.WriteString("select ")    for i, it := range me.fields {        if i > 0 {            b.WriteRune(',')        }        b.WriteString(it)    }    b.WriteString(" from ")    b.WriteString(me.table)    if len(me.conditions) > 0 {        b.WriteString(" where ")        for i, it := range me.conditions {            if i > 0 {                b.WriteString(" and ")            }            b.WriteString(it)        }    }    if len(me.orderBy) > 0 {        b.WriteString(" order by ")        b.WriteString(me.orderBy)    }    return b.String()}

tSQLQueryBuilder.go

tSQLQueryBuilder实现了ISQLQueryBuilder接口, 为各种参数设置提供了办法

package buildertype tSQLQueryBuilder struct {    query *tSQLQuery}func NewSQLQueryBuilder() ISQLQueryBuilder {    return &tSQLQueryBuilder {        query : newSQLQuery(),    }}func (me *tSQLQueryBuilder) WithTable(table string) ISQLQueryBuilder {    me.query.table = table    return me}func (me *tSQLQueryBuilder) AddField(field string) ISQLQueryBuilder {    me.query.fields = append(me.query.fields, field)    return me}func (me *tSQLQueryBuilder) AddCondition(condition string) ISQLQueryBuilder {    me.query.conditions = append(me.query.conditions, condition)    return me}func (me *tSQLQueryBuilder) WithOrderBy(orderBy string) ISQLQueryBuilder {    me.query.orderBy = orderBy    return me}func (me *tSQLQueryBuilder) Build() ISQLQuery {    return me.query}

建造者模式小结

建造者模式的长处
(1)封装性好,构建和示意拆散。
(2)扩展性好,建造类之间独立,在肯定水平上解耦。
(3)便于管制细节,建造者能够对创立过程逐渐细化,而不对其余模块产生任何影响。
建造者模式的毛病
(1)须要多创立一个IBuilder对象。
(2)如果产品外部发生变化,则建造者也要同步批改,前期保护老本较大。

(end)