博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go实现单例模式
阅读量:4190 次
发布时间:2019-05-26

本文共 1678 字,大约阅读时间需要 5 分钟。

目录


 

单例模式

单例模式是最简单的设计模式之一,它提供了创建对象的最佳方式。这种模式涉及到一个单一的结构体,该结构体负责创建自己的对象,同时确保只有单个对象被创建。即多次创建一个结构体的对象,得到的对象的存储地址永远与第一次创建对象的存储地址相同。

 

实现原理

利用 sync.Once 方法Do,确保Do中的方法只被执行一次的特性,创建单个结构体实例。

 

实现

import (	"sync")var (	instance 	*School	once 		sync.Once)type School struct {	Name	string	Tel		string}func CreateSchool(name, tel string) *School {	once.Do(func() {		instance = new(School)		instance.Name = name		instance.Tel = tel	})		return instance}

使用Do方法也巧妙的保证了并发线程安全。

 

测试

package mainimport (	"fmt"	"strconv"	"sync")var (	instance 	*School	once 		sync.Once)type School struct {	Name	string	Tel		string}func CreateSchool(name, tel string) *School {	once.Do(func() {		fmt.Println("----- init -----")		instance = new(School)		instance.Name = name		instance.Tel = tel	})	return instance}func main() {	var wg sync.WaitGroup	wg.Add(10)	for i:=0; i<10; i++ {		go func(seq int) {			defer wg.Done()			seqStr := strconv.Itoa(seq)			school := CreateSchool("school"+seqStr, seqStr)			fmt.Printf(				"%s\tname: %s,\t tel: %s,address:%p\n",				seqStr,				school.Name,				school.Tel,				school,				)		} (i)	}	wg.Wait()}

执行结果:

----- init -----9       name: school9,   tel: 9,address:0xc0000b00002       name: school9,   tel: 9,address:0xc0000b00005       name: school9,   tel: 9,address:0xc0000b00003       name: school9,   tel: 9,address:0xc0000b00004       name: school9,   tel: 9,address:0xc0000b00006       name: school9,   tel: 9,address:0xc0000b00000       name: school9,   tel: 9,address:0xc0000b00008       name: school9,   tel: 9,address:0xc0000b00007       name: school9,   tel: 9,address:0xc0000b00001       name: school9,   tel: 9,address:0xc0000b0000

可以看出,Do函数中的内容仅被执行了一次,所有实例化的对象都有相同的内容,且指向的地址相同。

转载地址:http://xdsoi.baihongyu.com/

你可能感兴趣的文章
谈新手修练J2EE武功及学SSH的方法
查看>>
一个程序员充实的2006
查看>>
我眼中的博客MVB与投票
查看>>
EasyJF开源CMS开发团队重组,欢迎开源爱好者加入!
查看>>
休博几天
查看>>
图解EasyJWeb框架结构
查看>>
插件开发招人及《开源人》征稿
查看>>
换电脑了
查看>>
写代码.VS.写作
查看>>
偶的blog百篇原创留念-呵呵
查看>>
《深入Spring2》终于开始发布电子版本了
查看>>
这样的开源基金设想行得通吗?
查看>>
从山丘锤王之死谈Spring AOP中的引介(Introduction)
查看>>
有谁知道10级的山丘之王是怎么死的?
查看>>
开始学习写日记
查看>>
中国开源众生相-也谈“中国人的开源”
查看>>
Velocity脚本简明教程推荐
查看>>
空(标识)接口的重要性
查看>>
用AspectJ做的一个回合格斗小游戏
查看>>
在EasyJWeb中使用Java Excel API 处理电子表格
查看>>