go语言设计模式之Flyweight(享元模式)
flyweight.go
package flyweight
import (
"time"
)
const (
TEAM_A = "A"
TEAB_B = "B"
)
type Team struct {
ID uint64
Name string
Shield []byte
Players []Player
HistoricalData []HistoricalData
}
type Player struct {
Name string
Surname string
PerviousTeam uint64
Photo []byte
}
type HistoricalData struct {
Year uint8
LeagueResults []Match
}
type Match struct {
Date time.Time
VisitorID uint64
LocalID uint64
LocalScore byte
VisitorScore byte
LocalShoots uint16
VisitorShoots uint16
}
type teamFlyweightFactory struct {
createdTeams map[string]*Team
}
func (t *teamFlyweightFactory) GetTeam(teamID string) *Team {
if t.createdTeams[teamID] != nil {
return t.createdTeams[teamID]
}
team := getTeamFactory(teamID)
t.createdTeams[teamID] = &team
return t.createdTeams[teamID]
}
func getTeamFactory(team string) Team {
switch team {
case TEAB_B:
return Team{
ID: 2,
Name: TEAB_B,
}
default:
return Team{
ID: 1,
Name: TEAM_A,
}
}
}
func (t *teamFlyweightFactory) GetNumberOfObjects() int {
return len(t.createdTeams)
}
func NewTeamFactory() teamFlyweightFactory {
return teamFlyweightFactory{
createdTeams: make(map[string]*Team),
}
}
flyweight_test.go
package flyweight
import (
"fmt"
"testing"
)
func TestTeamFlyweightFactory_GetTeam(t *testing.T) {
factory := NewTeamFactory()
teamA1 := factory.GetTeam(TEAM_A)
if teamA1 == nil {
t.Error("The pointer to the TEAM_A was nil")
}
teamA2 := factory.GetTeam(TEAM_A)
if teamA2 == nil {
t.Error("The pointer to the TEAM_A was nil")
}
if teamA1 != teamA2 {
t.Error("TEAM_A pointers weren't the same")
}
if factory.GetNumberOfObjects() != 1 {
t.Errorf("The number of objects created was not 1: %d\n", factory.GetNumberOfObjects())
}
}
func Test_HighVolume(t *testing.T) {
factory := NewTeamFactory()
teams := make([]*Team, 5000*2)
for i := 0; i < 5000; i++ {
teams[i] = factory.GetTeam(TEAM_A)
}
for i := 5000; i < 2*5000; i++ {
teams[i] = factory.GetTeam(TEAB_B)
}
if factory.GetNumberOfObjects() != 2 {
t.Errorf("The number of objects created was not 2: %d\n", factory.GetNumberOfObjects())
}
for i := 0; i < 3; i++ {
fmt.Printf("Pointer %d points to %p and is located in %p\n", i, teams[i], &teams[i])
}
}

go语言设计模式之Flyweight(享元模式)的更多相关文章
- 设计模式之flyweight享元模式
运用共享技术支持大量细粒度对象的使用 Flyweight模式(享元) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模 ...
- 面向对象设计模式之Flyweight享元模式(结构型)
动机:采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价.如何在避免大量细粒度对象问题的同 时,让外部客户程序仍然能够透明地使用面向对象的 ...
- 设计模式(11)--Flyweight(享元模式)--结构型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 2.模式特点: 享元模 ...
- Java设计模式:Flyweight(享元)模式
概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ...
- 设计模式11: Flyweight 享元模式(结构型模式)
Flyweight 享元模式(结构型模式) 面向对象的代价 面向对象很好的解决了系统抽象性的问题,同时在大多数情况下也不会损及系统的性能.但是,在某些特殊应用中,由于对象的数量太大,采用面向对象会给系 ...
- C++设计模式-Flyweight享元模式
Flyweight享元模式 作用:运用共享技术有效地支持大量细粒度的对象. 内部状态intrinsic和外部状态extrinsic: 1)Flyweight模式中,最重要的是将对象分解成intrins ...
- 20、FlyWeight 享元模式
池化的思想 1.Flyweight享元模式 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用.由于享元模式要求能够共享的对象必 ...
- Java设计模式之《享元模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6542449.html 享元模式:"享"就是分享之意,指一物被众人共享, ...
- Flyweight享元模式(结构型模式)
1.面向对象的缺点 虽然OOP能很好的解决系统抽象的问题,并且在大多数的情况下,也不会损失系统的性能.但是在某些特殊的业务下,由于对象的数量太多,采用面向对象会给系统带来难以承受的内存开销.示例代码如 ...
随机推荐
- 搭建ES集群
服务版本选择 TEG的ctsdb当前最高版本采用的是es的6.4.3版本,为了日后与ctsdb衔接方便,部署开源版es时也采用该版本.6.4.3版本的es依赖的jdk版本要求在8u181以上,测试环境 ...
- MS16-072域内中间人攻击
0x01 漏洞利用 在目标主机域用户口令已知的条件下,目标主机在进行策略更新时,对域服务器的认证存在漏洞,攻击者劫持认证服务器的过程,引导至伪造的域服务器,并在域服务器中制定用户的计划任务策略,可以获 ...
- WestWild: 1.1: Vulnhub Walkthorugh
启动界面 主机层面扫描: ╰─ nmap -p1-65535 -sV -A 10.10.202.131 Starting Nmap 7.70 ( https://nmap.org ) at 2019- ...
- 复杂的POI导出Excel表格(多行表头、合并单元格)
poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...
- oracle截取时间的年/月/日/时/分/秒
修改日期格式为年月日时分秒: alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';select to_char(sysdate,'yyy ...
- linux 启动jar包 指定yml配置文件和输入日志文件
命令为: nohup java -jar project.jar --spring.config.location=/home/project-conf/application.yml > ...
- Java连载54-两种单例模式、接口详解
一.单例模式分为两种: (1)饿汉式单例:在类加载阶段就创建了一个对象. (2)懒汉式单例:用对对象的时候才会创建对象.(连载53中例子就是懒汉式) 饿汉式举例: package com.bjpowe ...
- IT兄弟连 HTML5教程 CSS3揭秘 CSS3概述
对于Web开发者来说,CSS3不只是一门新奇的技术,更重要的是这些全新概念的Web应用给开发人员带来了无限的可能性,也极大地提高了开发效率.我们不必再依赖图片或者JavaScript去完成圆角.多背景 ...
- js鼠标滚轮事件上滚下滚判断
onmousewheel <script> var scrollFunc = function (e){ //其实我一开始也不知道用啥 //console.log(e)我们可以打印一下 / ...
- Linux-用户/分组相关以及处理密码遗忘
一.用户创建 1.简单创建 useradd 用户名 2.指定目录创建用户 useradd -d 目录路径 用户名 //注意这一类的目录路径必须写当前所在文件夹的相对路径而不能直接写目录名称 3.指定用 ...