手撸 golang 创立型设计模式 建造者模式
缘起
最近温习设计模式
拜读谭勇德的 << 设计模式就该这样学 >>
本系列笔记拟采纳 golang 练习之
建造者模式
建造者模式(Builder Pattern)将一个简单对象的构建过程与它的示意拆散,使得同样的构建过程能够创立不同的示意,属于创立型设计模式。
_
场景
- 某业务零碎, 心愿应用 SQLQuery 类动静结构简单 SQL 查问语句
- SQLQuery 类的各种属性组合状况很多, 因而创立 SQLQueryBuilder 作为 SQLQuery 的建造者
builder_test.go
测试用例
package patterns
import (
"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_Builder
select id,name,price from product where enabled=1 order by price desc
--- PASS: Test_Builder (0.00s)
PASS
ok command-line-arguments 0.002s
ISQLQuery.go
定义 SQL 查问表达式的接口
package builder
type ISQLQuery interface {ToSQL() string
}
ISQLQueryBuilder.go
定义 SQL 查问表达式的建造者接口, 该接口定义了一系列步骤去创立简单查问语句
package builder
type 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 builder
import "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 builder
type 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)