原型设计模式go实现尝试

文章目录


前言

本文章尝试使用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

总结

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

相关推荐
xiaolyuh1237 小时前
Spring 框架 核心架构设计 深度详解
spring·设计模式·spring 设计模式
nbsaas-boot10 小时前
Go vs Java 的三阶段切换路线图
java·开发语言·golang
modelmd13 小时前
Go 编程语言指南 练习题目分享
开发语言·学习·golang
福大大架构师每日一题16 小时前
2026年1月TIOBE编程语言排行榜,Go语言排名第16,Rust语言排名13。C# 当选 2025 年度编程语言。
golang·rust·c#
GISer_Jing18 小时前
智能体工具使用、规划模式
人工智能·设计模式·prompt·aigc
GISer_Jing18 小时前
AI Agent:学习与适应、模型上下文协议
人工智能·学习·设计模式·aigc
拔剑纵狂歌19 小时前
helm-cli安装资源时序报错问题问题
后端·docker·云原生·容器·golang·kubernetes·腾讯云
小马爱打代码20 小时前
MyBatis设计模式:构建者、工厂、代理模式
设计模式·mybatis·代理模式
月明长歌20 小时前
Javasynchronized 原理拆解:锁升级链路 + JVM 优化 + CAS 与 ABA 问题(完整整合版)
java·开发语言·jvm·安全·设计模式
会员果汁20 小时前
12.设计模式-状态模式
设计模式·状态模式