原型设计模式go实现尝试


前言

本文章尝试使用go实现“原型”。


代码

package main

import (
	"fmt"
)

// 不同原型标志枚举
type Type int

const (
	PROTOTYPE_1 Type = iota
	PROTOTYPE_2
)

// 原型接口
type IPrototype interface {
	Clone() IPrototype
	Method(value int)
	Print()
}

// 具体原型1
type ConcretePrototype1 struct {
	name  string
	value int
}

// 构造函数
func NewConcretePrototype1ByFields(name string, value int) *ConcretePrototype1 {
	return &ConcretePrototype1{
		name,
		value,
	}
}

func NewConcretePrototype1ByObject(cp *ConcretePrototype1) *ConcretePrototype1 {
	return &ConcretePrototype1{
		name:  cp.name,
		value: cp.value,
	}
}

// 接口方法
func (cp *ConcretePrototype1) Clone() IPrototype {
	return NewConcretePrototype1ByObject(cp)
}

func (cp *ConcretePrototype1) Method(value int) {
	cp.value = value
}

func (cp *ConcretePrototype1) Print() {
	fmt.Println("Call Method1 from ", cp.name, " with field : ", cp.value)
}

// 具体原型2
type ConcretePrototype2 struct {
	name  string
	value int
}

// 构造函数
func NewConcretePrototype2ByFields(name string, value int) *ConcretePrototype2 {
	return &ConcretePrototype2{
		name,
		value,
	}
}

func NewConcretePrototype2ByObject(cp *ConcretePrototype2) *ConcretePrototype2 {
	return &ConcretePrototype2{
		name:  cp.name,
		value: cp.value,
	}
}

// 接口方法
func (cp *ConcretePrototype2) Clone() IPrototype {
	return NewConcretePrototype2ByObject(cp)
}

func (cp *ConcretePrototype2) Method(value int) {
	cp.value = value
}

func (cp *ConcretePrototype2) Print() {
	fmt.Println("Call Method2 from ", cp.name, " with field : ", cp.value)
}

// 原型工厂
type PrototypeFactory struct {
	prototypes map[Type]IPrototype
}

func NewPrototypeFactory() *PrototypeFactory {
	return &PrototypeFactory{
		prototypes: map[Type]IPrototype{
			PROTOTYPE_1: NewConcretePrototype1ByFields("PROTOTYPE_1 ", 1),
			PROTOTYPE_2: NewConcretePrototype2ByFields("PROTOTYPE_2 ", 2),
		},
	}
}

func (p *PrototypeFactory) CreatePrototype(t Type) IPrototype {
	return p.prototypes[t].Clone()
}

// 客户端代码
func clientCode(p *PrototypeFactory) {
	fmt.Println("Let's create a Prototype 1")

	prototype1 := p.CreatePrototype(PROTOTYPE_1)
	prototype2 := p.CreatePrototype(PROTOTYPE_1)
	prototype1.Method(3)
	prototype2.Method(4)
	prototype1.Print()
	prototype2.Print()

	fmt.Println()

	fmt.Println("Let's create a Prototype 2")

	prototype1 = p.CreatePrototype(PROTOTYPE_2)
	prototype2 = p.CreatePrototype(PROTOTYPE_2)
	prototype1.Method(5)
	prototype2.Method(6)
	prototype1.Print()
	prototype2.Print()
}

func main() {
	clientCode(NewPrototypeFactory())
}

结果

Let's create a Prototype 1
Call Method1 from  PROTOTYPE_1   with field :  3
Call Method1 from  PROTOTYPE_1   with field :  4

Let's create a Prototype 2
Call Method2 from  PROTOTYPE_2   with field :  5
Call Method2 from  PROTOTYPE_2   with field :  6

总结

新人设计模式理解,望大家多多指点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值