go设计模式之建造者模式

这是要写的创建类模式最后一篇,先看下,建造者模式的定义吧。

将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。

看到这个定义有点难懂,建造者有以下几个角色。

  1. Product 这是我们要创建的复杂对象(一般都是很复杂的对象才需要使用建造者模式)。
  2. Builder 抽象的一个东西, 主要是用来规范我们的建造者的。
  3. ConcreteBuilder 具体的Builder实现, 这是今天的重点,主要用来根据不用的业务来完成要创建对象的组建的创建。
  4. Director 这个的作用是规范复杂对象的创建流程。

基于以上的理论,我们还是通过代码来实现

定义接口Builder

type Builder struct {

Part1()
Part2()
Part3()

}

定义Director

type Director struct {

Build Builder

}

func NewBuilder(build Builder) *Director {

return &Director{
    Build: build,
}

}

定义Director的ConcreteBuilder

//Construct Product

func (d *Director) Construct() {

d.builder.Part1()
d.builder.Part2()
d.builder.Part3()

}

接下来实现product这个产品

type Builder1 struct {

result string

}

func (b *Builder1) Part1() {

b.result += "1"

}

func (b *Builder1) Part2() {

b.result += "2"

}

func (b *Builder1) Part3() {

b.result += "3"

}

func (b *Builder1) GetResult() string {

return b.result

}

type Builder2 struct {

result int

}

func (b *Builder2) Part1() {

b.result += 1

}

func (b *Builder2) Part2() {

b.result += 2

}

func (b *Builder2) Part3() {

b.result += 3

}

func (b *Builder2) GetResult() int {

return b.result

}

以下实现的完整代码

package main

import "fmt"

type Builder interface {

Part1()
Part2()
Part3()

}

type Director struct {

Builder Builder

}

func NewDirector(builder Builder) *Director {

return &Director{
   Builder:builder,
}

}

func (d *Director) Construct() {

d.Builder.Part1()
d.Builder.Part2()
d.Builder.Part3()

}

type Builder1 struct {

result string

}

func (b *Builder1) Part1() {

b.result += "1"

}

func (b *Builder1) Part2() {

b.result += "2"

}

func (b *Builder1) Part3() {

b.result += "3"

}

func (b *Builder1) GetResult() string {

return b.result

}

type Builder2 struct {

result int

}

func (b *Builder2) Part1() {

b.result += 1

}

func (b *Builder2) Part2() {

b.result += 2

}

func (b *Builder2) Part3() {

b.result += 3

}

func (b *Builder2) GetResult() int {

return b.result

}

func main() {

builder1 := &Builder1{}
director1 := NewDirector(builder1)
director1.Construct()
res1 := builder1.GetResult()
fmt.Println("构造1", res1)
builder2 := &Builder2{}
director2 := NewDirector(builder2)
director2.Construct()
res2 := builder2.GetResult()
fmt.Println("构造2", res2)

}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程之路

羊皮书APP(Android版)开发系列(十)Android开发常用工具类

14110
来自专栏技术小黑屋

关于获取当前Activity的一些思考

在Android开发过程中,我们有时候需要获取当前的Activity实例,比如弹出Dialog操作,必须要用到这个。关于如何实现由很多种思路,这其中有的简单,有...

22930
来自专栏Android知识点总结

4-VI--☆ListView的封装支持多种条目

13450
来自专栏张泽旭的专栏

android下拉五级菜单联动

本人是一个不擅长Android的开发的,但是这几天在做联通的一个服务器配件管理系统,做完B/S的又要写C/S的,老板要求没办法。在做的过程中遇到了一个下拉菜单联...

21230
来自专栏Android知识点总结

O3-开源框架使用之Butterknife 8.8.1及源码浅析

cast()方法是Clazz的一个公共方法:由下可见它反会一个由传入值强转成的T类型对象

24340
来自专栏开发之途

Android 解析RecyclerView(2)——带顶部View和底部View的RecyclerView

36750
来自专栏hbbliyong

Android 操作Sqlite

首先要用一个类来继承SQLiteOpenHelper,并必须实现   public DatabaseHelper(Context context, Strin...

411100
来自专栏开发之途

RxJava2 入门详细笔记(2)

通过一定逻辑来过滤被观察者发送的事件,如果返回 true 则会发送事件,否则不会发送

9410
来自专栏肖蕾的博客

自定义BaseAdapter完美解决ListView异常:java.lang.IllegalStateException这是代码使用方法原理另外

15380
来自专栏向治洪

自定义gradview

虽然Android已自带了GridView,但是,却不够灵活,同时也不能自由添加控件,因此,本人通过需要进一步封装,来实现Android自定义GridView控...

219100

扫码关注云+社区

领取腾讯云代金券