Skip to content

Latest commit

 

History

History
77 lines (48 loc) · 2.18 KB

2.md

File metadata and controls

77 lines (48 loc) · 2.18 KB

单例模式(Singleton Pattern)

题:实现单例模式

什么是单例模式

单例模式,也叫单件模式,是一种常见的软件设计模式。单例模式确保一个类只有一个实例,并提供

为什么要单例模式

​ 有一些对象我们只需要一个,比方说:线程池(threadpool)、缓存(cache)、日志对象等等。事实上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量,或者是不一致的结果。

​ 保证只有一个对象,省略了后续创建对象所花费的时间,也减轻了垃圾回收的压力(GC)

如何实现单例模式

实现单例模式的关键是

  • 保证对象只有一个

  • 线程安全

首先来看python,能使用__init__方法来限制的对象的初始化吗?实际上,__init__并不是构造函数,__init__干的是创建好对象后初始化变量。真正创建实例的是__new__方法。下面是python实现的单例模式:

class Singleton(object):
   _instances = {}
   _lock = Lock()

   def __new__(cls, *args, **kw):
       # 如果不存在实例,则需要加锁创建新的实例,减少程序不必要的加锁
       if cls not in cls._instances:
           # sleep 1s 现象更容易出现
           # time.sleep(1)
           with cls._lock:
               # Double-checked_locking pattern.
               if cls not in cls._instances:
                   cls._instances[cls] = super(Singleton, cls).__new__(cls, *args, **kw)
       return cls._instances[cls]

class MyClass(Singleton):
   a = 1

go的实现,使用sync.Once来确保多个goroutine同时进行处理的时候,操作只执行了一次,从而保证线程安全。

package singleton

import (
	"sync"
)

type singleton map[string]string

var (
    once sync.Once

    instance singleton
)

func New() singleton {
	once.Do(func() {
		instance = make(singleton)
	})

	return instance
}

完整示例代码见:https://github.com/yunqingqing/exercise/tree/master/code/python/day2