设计模式-建造者模式(Go语言描述)

标签: go语言 设计模式 golang
6441人阅读 评论(0) 收藏 举报
分类:

在上一篇博客设计模式-装饰者模式中我们介绍了如何在golang中实现装饰者模式,今天我们接着上篇博客继续设计模式系列文章,今天还是来看一个简单的设计模式-建造者模式

介绍

相信做过android的同学对建造者模式还是比较熟悉的, 一定用过开源的图片加载框架ImageLoader吧, 在ImageLoader的配置中我们就使用了建造者模式, 那什么是建造者模式呢?来看一下定义:

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

建造者模式中有一下几个角色需要我们熟悉:

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

在来看看创建模式的结构图:

好了,了解了什么是建造者以及建造者中涉及的几个角色,下面我们就来用代码实现一下建造者模式,根据上面提到的几个角色,我们依依用代码来实现它。 今天我们用一个游戏中的角色创建的事例来展示代码,我们这个游戏角色很简单,仅仅包含名称和使用的武器两个字段。

创建复杂对象

首先我们来创建具体的游戏人物类

type Character struct {
  Name string
  Arms string
}

func (p *Character) SetName(name string) {
  p.Name = name
}

func (p *Character) SetArms(arms string) {
  p.Arms = arms
}

func (p Character) GetName() string {
  return p.Name
}

func (p Character) GetArms() string {
  return p.Arms
}

这个类很简单,除了包含我们上面提到了名称和使用的武器两个字段外,剩下的代码仅仅是为这两个字段提供getter和setter方法了,这里不多说了,下面我们就根据这个类来创建一个建造者接口。

实现抽象建造者接口

type Builder interface {
  SetName(name string) Builder
  SetArms(arms string) Builder
  Build() *Character
}

前两个方法是我们根据游戏人物类设计出来的,最后一个Build方法用来返回我们创建的游戏人物对象。

创建具体的创建者类

下面我们就来根据上面定义的接口来实现一个具体的创建者类,

type CharacterBuilder struct {
  character *Character
}

func (p *CharacterBuilder) SetName(name string) Builder {
  if p.character == nil {
    p.character = &Character{}
  }
  p.character.SetName(name)
  return p
}

func (p *CharacterBuilder) SetArms(arms string) Builder {
  if p.character == nil {
    p.character = &Character{}
  }
  p.character.SetArms(arms)
  return p
}

func (p *CharacterBuilder) Build() *Character {
  return p.character
}

这个结构体实现了上面定义的接口Builder的所有方法,所以它实现了Builder接口,并且它还拥有一个Character的变量,我们就是用来创建这个类型的实例。Build方法最后返回我们创建的游戏角色对象。

Director的实现

上面说过,Director的作用主要是规范对象的组件的创建流程,来看看它的实现吧:

type Director struct {
  builder Builder
}

func (p Director) Create(name string, arms string) *Character {
  return p.builder.SetName(name).SetArms(arms).Build()
}

他需要一个Builder的实例,所以我们在创建Director的时候需要定义一个Builder的具体实现,Director只有一个方法-Create方法,我们通过调用Create方法来根据参数创建具体的游戏角色。
最后我们再来看看如何使用:

func main() {
  var builder Builder = &CharacterBuilder {}
  var director *Director = &Director {builder: builder}
  var character *Character = director.Create("loader", "AK47")
  fmt.Println(character.GetName() + "," + character.GetArms())
}

首先我们创建了一个Builder具体实现的实例,接着将他给Director的实例,最后我们通过调用DirectorCreate方法来完成具体游戏角色的创建。最后我们再强调一点,什么时候使用创建者模式? 当一个对象并不是很复杂的时候不太适用创建者模式,当我们需要创建的对象特别复杂的时候才考虑使用创建者模式实现。

代码放github上了,欢迎star: https://github.com/qibin0506/go-designpattern

查看评论

设计模式-策略模式(Go语言描述)

好久没有更新博客了,最近也是在忙着充电,从今天这篇博客开始,我们来了解一下设计模式。设计模式那什么是设计模式呢?首先来看看我从百科上copy下来的概念吧。 设计模式/软件设计模式(Design p...
  • qibin0506
  • qibin0506
  • 2016-01-22 23:49:23
  • 6734

设计模式-单例模式(Go语言描述)

这篇博客我们继续来看设计模式,今天带来的是一个最简单而且最常用的模式-单例模式。那什么是单例模式呢?相信大家最它最熟悉不过了,那我们就来快速的了解一下它的定义。 保证一个类仅有一个实例,并提供一个...
  • qibin0506
  • qibin0506
  • 2016-02-24 20:30:18
  • 12992

C语言实现《设计模式之禅》之建造者模式

{CSDN:CODE:156347}
  • chengrile
  • chengrile
  • 2014-01-14 16:46:55
  • 501

设计模式——建造者

最近的心得,我发现学一门设计模式,不管你是否能立刻理解它,第一最要紧的是要记住两个东西。1、它是属于什么范畴的设计模式。2、记住UML图。这两个是打开这个设计模式之门的金钥匙!为什么这么讲?因为刚刚学...
  • hello_haozi
  • hello_haozi
  • 2014-08-25 14:17:08
  • 16459

设计模式——建造者模式解析

1.  建造者模式介绍建造者模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式包括的角色:(1)Builder:给出一个抽象接口或抽象类,以规范产品的建造...
  • SEU_Calvin
  • SEU_Calvin
  • 2016-08-19 13:33:04
  • 12958

设计模式系列之 建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最...
  • a82793510
  • a82793510
  • 2015-05-13 23:21:54
  • 528

设计模式:建造者模式(Builder)

建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。  建造者模式通常包括下几个角色: 1. builder(抽象建造者):给出一个抽象结论,以规范产品对象的...
  • u013256816
  • u013256816
  • 2016-03-25 11:18:54
  • 2620

设计模式笔记17:建造者模式(Builder Pattern)

一、建造者模式的内容         建造者模式封装一个产品的构造过程,并允许按步骤构造。         将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。    ...
  • yangzl2008
  • yangzl2008
  • 2012-06-17 16:57:19
  • 1583

超赞的GO语言设计模式和成例集锦

来自:http://geek.csdn.net/news/detail/100051 Go语言从面世就受到了业界的普遍关注,曾有文章分析,Go是最有可能改变未来IT技术的十大语言之一。本文作...
  • Blues1021
  • Blues1021
  • 2016-09-08 09:26:09
  • 1184

PHP设计模式——建造者模式

声明:本系列博客参考资料《大话设计模式》,作者程杰。        建造者模式也称生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为...
  • jhq0113
  • jhq0113
  • 2015-04-25 11:30:51
  • 2808
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 68万+
    积分: 7044
    排名: 4048
    友情链接

    鸿洋_

    Aggie的博客

    梁肖技术中心

    极客导航

    文章分类
    博客专栏
    最新评论