跟刺猬哥一起学习设计模式【Singleton模式】

设计模式的分类

从目的来看:

创建型模式:负责对象创建

结构性模式:处理类与对象间的组合

行为型模式:类与对象交互中的职责分配

从范围来看:

类模式处理类与子类的静态关系

对象模式处理对象间的动态关系

动机

在软件系统中,经常有这样的一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率。

如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例呢?其实这应该是类设计者的责任,而不是使用者的责任。

意图

保证一个类仅有一个实例,并提供一个该实例的全局访问点。  -----《设计模式》 Gof

单线程Singleton 模式实现

public class Singleton
{
      private static Singleton instance;
      private Singleton() {}
      public static Singleton Instance
      {
           get
           {
                if(instance == null)
                {
                      instance = new Singleton();
                }
                return instance;
           }
      }
}        

单线程Singleton模式有以下几个要点:

Singleton模式中的实例构造器可以设置为protected以允许子类派生。

Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与模式初衷违背。

Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,与初衷违背。

Singleton模式只考虑了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,一般没有必要对其销毁进行特护的管理。

不能应对多线程环境,在多线程环境下,使用可能得到多个实例对象。

二、多线程下的Singleton模式

public class Singleton
{
        private static volatile Singleton _instance=null;
        private static readonly object syslock = new object();  

        private Singleton() {}     

        public static Singleton Instance()
        {
            if (_instance == null)
            {
                lock (syslock)
                {
                    if (_instance == null)
                    {
                        _instance = new Singleton();
                    }
                }
            }
            return _instance;
        }}
时间: 2024-10-25 03:33:06

跟刺猬哥一起学习设计模式【Singleton模式】的相关文章

数据库学习设计模式--组合模式

介绍: 想必你已经了解了数据结构中的树,ok,组合模式对于你就是一会儿的功夫了.组合模式相对来说比较简单.看一下定义 abstract class Component { protected String name; //这个用来标示一下节点 public Component(String name) { this.name = name; } public abstract void add(Component c);//增加儿子节点 public abstract void remove(C

跟着ZHONGHuan学习设计模式--组合模式

跟着ZHONGHuan学习设计模式 组合模式 介绍: 想必你已经了解了数据结构中的树,ok,组合模式对于你就是一会儿的功夫了.组合模式相对来说比较简单.看一下定义 组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构.使得用户对单个对象和组合对象的使用具有一致性. 暂时没有想到好的例子,如果你有,请告诉我.下面我用树来对组合模式进行解释.树的结构是下面的这样的: 没棵树有一个根节点,也有叶子节点和树枝节点,一些结构都是用树结构表示的,例如树形菜单,文件和文件夹目录.那么如何存储管理这样的

学习设计模式 - 代理模式

学习设计模式 - 代理模式 一丶定义 代理模式为另一个对象提供替身或者占位符以控制对这个对象访问, 被代理的对象可以是远程的对象.创建开销大的对象.需要安全控制的对象 二丶理解 2.1) 当一个对象除了处理真正的业务逻辑之外, 还需要增加额外的处理,如事务,打印日志等等, 如果将这些额外逻辑放到原对象中,会造成职责不清晰.        这时可以使用代理对象代理该对象, 代理对象实现额外逻辑, 真正的业务逻辑则委托给被代理对象处理.这样可以使得职责清晰. 2.2) 为另一个对象提供一个替身或占位

设计模式--singleton模式

使用单件模式的意图是保证一个类只有一个实例,并提供一个访问它的全局访问点. 将单件定义为全局或静态对象,然后依赖于自动的初始化,并不能完全实现上述意图.虽然可以提供全局访问点,但这是不够的.原因如下: 1)我们不能保证静态对象只有一个实例会被声明. 2)我们可能没有足够信息在静态初始化时实例化每个单件,单件可能需要在程序运行中稍后被计算出来的值. 3)c++没有定义转换单元上全局对象的构造器的调用顺序.这意味着单件之间不存在依赖关系:如果有,那么错误将是不可避免的. 4)使用全局或静态对象的实现

GOF设计模式——Singleton模式

一.什么是Singleton模式? Singleton模式就是平常所说的单例模式,简单来说就只有一个实例.在使用java.lang.String的时候,将不同的字符串赋给String引用,其实就是创建了一个String对象实例,当有1000个不同的字符串创建的时候,就会出现1000个实例.有时候,我们只想在程序里面创建一个实例,譬如Hibernate的SessionFactory,那么我们可以使用Singleton模式来设计某一个类从始至终,程序调用的都是属于同一个实例. 二.Singleton

c++11 改进设计模式 Singleton模式

关于学习 <深入应用c++11>的代码笔记: c++11之前是这么实现的 template<typename T> class Singleton{ public: static T* Instance(){ if (m_pInstance == nullptr) m_pInstance = new T(); return m_pInstance; } template<typename T0> static T* Instance(T0 arg0){ if (m_pI

一起学习设计模式-策略模式

大家好: 我近期写了一个TCP长连接的框架,封装的Netty,序列化采用的是PB,内存缓存用的Google的Guava.项目托管在GitHub上,开源希望大家能用起来并且一起维护这个项目.我是做游戏服务器的,像客户端的引擎框架有Cocos2d , Unity等.而服务器没有相对来说比较好的开源的架构(或者说鄙人学识浅薄没有发现).我也经历了几个游戏从开发到上线的这样一个过程,所以也看到过几个比较优秀的框架,现在的想法是能够开源一个服务器框架,然后大家各抒己见共同维护这个框架.因为我的经验尚短,框

学习设计模式--Singleton

意图:保证一个类只有一个实例,并提供一个访问它的合局访问点. 示例一:使用内部静态类的方式保存INSTANCE 1 /** 2 * Created by wiikii on 14-5-12. 3 */ 4 public class Singleton implements Serializable { 5 6 // 使用静态内部类保存INSTANCE 7 private static class SingletonHolder { 8 private static final Singleton

设计模式之美学习-设计模式-建造者模式(十起)

需求 我们需要定义一个资源池配置类 ResourcePoolConfig.这里的资源池,你可以简单理解为线程池.连接池.对象池等.在这个资源池配置类中,有以下几个成员变量,也就是可配置项.现在,请你编写代码实现这个 ResourcePoolConfig 类. 实现方式一 实现 public class ResourcePoolConfig { private static final int DEFAULT_MAX_TOTAL = 8; private static final int DEFA