golang设计模式(5)原型模式

原型模式意图

用原型实例指定创造对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式适用性

.当一个系统应该独立于它的产品创建、构成和表示时,要使用原型模式;
.当要实例化的类是在运行时刻指定时,例如动态装载;
.为了避免创建一个与产品类层次平行的工厂类层次时(和下一点很像,系统初始创建一个相对复杂的对象,也可以用在这基础上实现工厂模式,但是创建出来的对象和原来的对象在同一个层次);
.当一个类的实例只能有几个不同状态组合中的一种时,建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化对象更方便些。各种实例间的差异很小。但是初始化过程可能比较复杂。

结构(uml)
原型模式

原型模式作用
1、对客户隐藏了具体的产品类,因此减少了客户知道对象的数目。此外,这些模式使客户无需改变即可使用与特定应用相关的类(和工厂模式、建造者模式一样的效果)
2、运行时刻增加和删除产品,原型模式允许只通过客户注册原型实例就可以将一个新的具体产品类型注入系统。相比其他创建型模式更为灵活,因此客户可以在运行时刻建立和删除原型。(可能开发时候方便,要注意可维护性)
3、改变值以指定新对象,高度动态的系统允许通过对象复合定义新的行为。例如,通过一个对象变量指定值—-并不定义新的类型。通过实例化已有类并且将这些实例注册为客户对象的原型,就可以有效定义新类别的对象。客户可以将责职代理给原型,从而表现出新的行为。
4、改变结构以指定新对象。
5、减少子类的构造。这个在适用性中已经介绍过。
6、用类型动态配置应用,一些运行时刻环境允许动态将类装载到应用中。

缺点
每种具体实现类型都要有一个克隆自己的操作。在某些场景会比较困难。

实现

package main
import (
    "fmt"
)

type Role interface {
    Clone() Role
    SetHeadColor(string)
    SetEyesColor(string)
    SetTall(int64)
    Show()
}

type RoleChinese struct {
    HeadColor string
    EyesColor string
    Tall      int64
}

func (pR *RoleChinese) Clone() Role {
    var pChinese = &RoleChinese{HeadColor: pR.HeadColor, EyesColor: pR.EyesColor, Tall: pR.Tall}
    return pChinese
}

func (pR *RoleChinese) SetHeadColor(color string) {
    pR.HeadColor = color
}

func (pR *RoleChinese) SetEyesColor(color string) {
    pR.EyesColor = color
}

func (pR *RoleChinese) SetTall(tall int64) {
    pR.Tall = tall
}

func (pR *RoleChinese) Show() {
    fmt.Println("Role's headcolor is:", pR.HeadColor, " EyesColor is:", pR.EyesColor, " tall is:", pR.Tall)
}
func main() {
    var role Role
    role = &RoleChinese{HeadColor: "black", EyesColor: "black", Tall: 170}
    role.Show()
    ThisWriter := role.Clone()
    ThisWriter.SetTall(180)
    ThisWriter.Show()
    return
}

运行结果:

Role's headcolor is: black  EyesColor is: black  tall is: 170
Role's headcolor is: black  EyesColor is: black  tall is: 180

从例子中可以看到如果重新去创建ThisWriter这个对象,就会像新建role一样,这里类型相对简单,在实际开发中可能会是个比较复杂的类型。但是role和ThisWriter其他都一致,只有Tall不一致,如果重新创建会比较繁琐。用工厂类的话也会不是很合适,因为role和ThisWriter只有Tall属性不一致。如果再增加几个不同小改动的Role,使用工厂类会引入大量的类。所以使用原型模式最为合适。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值