目录:

  1. 举个栗子
  2. 概念介绍
  3. 使用场景

1.举个栗子

类图

plantuml

```

@startuml
'https://plantuml.com/class-diagram

class Elephant {
String name
String getName();
}

class Refrigerator {
List <Elephant> elephants;
void add(Elephant elephants);
}

class Main {
void main()
}

@enduml
```

按类图实现基本需求

2.概念解释

单例模式:全局唯一的对象

3.使用场景

main.go

```

package main

import (
"dbTest/Builder/singleton/elephant"
"dbTest/Builder/singleton/refrigerator"
"dbTest/Builder/singleton/refrigeratorCounter"
"fmt"
"time"
)

func main() {
fmt.Println("start add elephant")
elephants := elephant.Elephant{
"rampage",
}
refrigeratorEntity := refrigerator.GetInstance()
refrigeratorEntity.AddElephant(elephants)

refrigeratorCount := refrigeratorCounter.RefrigeratorCounter{}
for i := 0; i < 10; i++ {
go refrigeratorCount.CounterNum()
}
time.Sleep(time.Second)
fmt.Println("we are finished, nums:",refrigeratorEntity.GetTotalNum())
}

```

elephant.go

```
package elephant

type Elephant struct {
Name string
}

func (e Elephant) getName() string {
return e.Name
}

```

refigerator.go

```

package refrigerator

import (
"dbTest/Builder/singleton/elephant"
"sync"
)

var once = sync.Once{}

// 1、设计为小写字母开头,表示只在refrigerator包内可见,限制客户端程序的实例化
type refrigerator struct {
elephants []elephant.Elephant
}

// 2、定义一个包内可见的实例对象,也即单例
// 懒汉模式,先只声明,用的时候再初始化,有非并发安全,所有用sync.Once加锁
var instance *refrigerator

// 饿汉模式,系统初始化期间就完成了单例对象的实例化
// var instance = &refrigerator{elephants: []elephant.Elephant{}}

// GetInstance
// 3、定义一个全局可见的唯一访问方法
func GetInstance() *refrigerator {
once.Do(func() {
instance = &refrigerator{elephants: []elephant.Elephant{}}
})
return instance
}

func (r *refrigerator) AddElephant(elephants elephant.Elephant) {
r.elephants = append(r.elephants, elephants)
}

func (r refrigerator) GetTotalNum() int {
return len(r.elephants)
}

```

refrigeratorCounter.go

```
package refrigeratorCounter

import (
"dbTest/Builder/singleton/refrigerator"
"fmt"
)

type RefrigeratorCounter struct {

}

func (rc RefrigeratorCounter) CounterNum() {
fmt.Println("refrigeratorCount:",refrigerator.GetInstance().GetTotalNum())
return
}

```

  

Go实现常用软件设计模式一:单例模式的更多相关文章

  1. 软件设计模式之单例模式(JAVA)

    什么是单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系 ...

  2. Js常用的设计模式(1)——单例模式

    <Practical Common Lisp>的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通 ...

  3. Java开发中常用的设计模式(二)---单例模式

    一. 懒汉式单例 //懒汉式单例类.在第一次调用的时候实例化自己 public class Singleton { private Singleton() {} private static Sing ...

  4. [ 转载 ] Java中常用的设计模式

    Java中常用的设计模式 1.单例模式 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个 ...

  5. 常用的软件设计模式的Java实现——让编程从野生到飞起

    常用的软件设计模式的Java实现——让编程从野生到飞起_野生技术协会_科技_bilibili_哔哩哔哩  https://www.bilibili.com/video/av7596511/

  6. Java设计模式03:常用设计模式之单例模式(创建型模式)

    1.  Java之单例模式(Singleton Pattern ) 单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实 ...

  7. GJM : C#设计模式(1)——单例模式

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  8. 设计模式之 -- 单例模式(Singleton)

    单例模式是一种常用的软件设计模式,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问. 使用说明 1.使用时机  在某些系统中某些对象最多只能存在一个,例如Windows中只能打开一个 ...

  9. Java设计模式之——单例模式

    引自百度百科: 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类. 通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系 ...

  10. 文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

    本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述, ...

随机推荐

  1. noip2018提高组初赛试题

    一.单项选择题(共 10 题,每题 2 分,共计 20 分: 每题有且仅有一个正确选项) \2. 下列属于解释执行的程序设计语言是( ). A. C B. C++ C. Pascal D. Pytho ...

  2. mysql杂记漫谈

    Hello,大家好,我是烤鸭,这几天消失了一下,主要是线上系统出了点小bug和sql性能问题,在努力搬砖,就把之前的设计模式系列放了一下下,正好趁这个复习巩固了一下sql执行计划和sql优化等相关的东 ...

  3. winfrom,窗体抖动功能

    #region 方法一 Point first = this.Location; for (int i = 0; i < 50; i++) { Application.DoEvents(); R ...

  4. Windows 客户端802.1x的一些设置

    802.1x作为网络准入的验证,自然有很多好处.但是在实施过程中也遇到了些小问题.我在这里记录下来,希望对大家有帮助,遇到问题的时候能有个参考. 基于用户验证的方式,当用户修改了密码后,验证失败.此时 ...

  5. ProxySQL 密码管理

    ProxySQL是一个协议感知的proxy.由于ProxySQL基于流量进行路由,当一个客户端连接ProxySQL时,它还无法识别它的目标主机组,因此ProxySQL需要对该客户端进行认证.基于此,需 ...

  6. 解决nexus仓库只能拉取不能推送的问题

    当时正在使用jenkins自动构造镜像推送到nexus上的docker镜像仓库,突然间就报错如下,没法推送,超过重试次数后也是没法推送: ERROR: Build step failed with e ...

  7. elk使用微信ElartAlert企业微信告警,自定义告警内容

    第一种方式 alert: - "elastalert_modules.wechat_qiye_alert.WeChatAlerter" alert_text: " === ...

  8. DP 优化小技巧

    收录一些比较冷门的 DP 优化方法. 1. 树上依赖性背包 树上依赖性背包形如在树上选出若干个物品做背包问题,满足这些物品连通.由于 01 背包,多重背包和完全背包均可以在 \(\mathcal{O} ...

  9. DVWA File Upload level high 通关

    由于level 是 high 1.代码审计 <?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writi ...

  10. 分支结构之二:switch-case

    1.格式 switch(表达式){case 常量1: 执行语句1; //break; case 常量2: 执行语句2; //break; ... default: 执行语句n; //break; } ...