zoukankan      html  css  js  c++  java
  • 跟刺猬哥一起学习设计模式【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;
            }
    }
    You can reach me by surfing the web ---- huntjobs.cn,or sending e-mails to me,Here is my qq MailBox:1424870395@qq.com
  • 相关阅读:
    批量处理进程
    稳定寻找app package和activity的办法
    python yield
    记一次 Appium socket hang up 问题 以及小米手机关闭对uiautomator2.server的省电策略
    MySQL数据库连接不上、密码修改问题
    二、观察者模式(Observer Pattern)《HeadFirst设计模式》读书笔记
    一、策略模式(Strategy Pattern)《HeadFirst设计模式》读书笔记
    Java Scanner类中next()和nextLine()方法的区别
    Mybatis 9、Lombok
    Mybatis 8、使用注解开发
  • 原文地址:https://www.cnblogs.com/HedgehogBlog/p/5840013.html
Copyright © 2011-2022 走看看