关于单例设计模式的细究

在日常的项目开发中,常常会遇到一个类有且只有一个实例的情况,这就是典型的单例模式。

关于单例模式的设计有三种思路:

思路一:

    1.构造方法私有;

    2.声明全局的私有的静态的类的对象为null;

    3.提供公有的静态的getInstance方法,判断对象是否为空,若为空,则创建对象,否则,直接返回对象;

    public class Singleton{

      private Singleton(){}

      private static Singleton singletonObject ;

      public static synchronized Singleton getInstance(){

        return singletonObject  = singletonObject == null?new Singleton():singletonObject ;

      }

    }

    优点:类加载的时候不会加载实例对象,延迟加载,类加载速度快;

    缺点:但线程需要等待,前一个线程锁释放后下一个才能操作,如果高并发且对性能要求高的, 这种设计效果可能不理想。

思路二:

    1.构造方法私有

    2.直接实例化全局的私有的静态的类的对象

    3.提供公有的静态的getInstance方法,只有调用此方法即返回实例对象

    

    public class Singleton{

      private Singleton(){}

      private static Singleton singletonObject = new Singleton();

      public static Singleton getInstance(){

        return singletonObject ;

      }

    }

    

    优点:类加载的时候实例对象,获取对象速度快。线程安全,避免了多线程的同步问题,不用加线程锁;

    缺点:不具备延迟加载,类加载速度慢。此外,如果在类中还有其他静态方法或属性,调用时也会实例化对象,而这不是我们期待的

思路三:

    1.构造方法私有

    2.声明全局的私有的静态的类的对象为null

    3.提供静态的内部类,在内部类中声明类的实例对象

    4.提供公有的静态的getInstance方法,调用内部类的已实例化的对象

    

    public class Singleton{

      private Singleton(){}

      private static Singleton singletonObject;

      public static class SingletonHelper{

        private static final Singleton INSTANCE= new Singleton ();

      }

      public static Singleton getInstance(){

         singletonObject = SingletonHelper.INSTANCE

        return singletonObject ;

      }

    }

    

    优点:既达到了延迟加载的效果也线程安全,同时避免了线程同步降低性能的问题

    缺点:无

  备注:调用类的构造方法或静态成员时会classloader,在单例模式中,构造器已经私有,只有调用静态方法或属性才会classloader

时间: 2024-07-29 01:17:40

关于单例设计模式的细究的相关文章

单例设计模式

一:单例设计模式的定义 单例设计模式,顾名思义,就是在整个程序运行过程中,只向外界提供一个对象,这样做可以避免资源的浪费,例如 我们打开回收站或者ppt时,只会启动一个窗口. 单例模式的java实现: 1:饿汉式 1 /** 2 * 3 */ 4 package com.hlcui.singleton; 5 6 /** 7 * @author Administrator 饿汉式单例类 8 */ 9 public class SingletonDemo { 10 // 1:内部创建一个对象 11

iOS 中的单例设计模式

单例设计模式:在它的核心结构中只包含一个被称为单例类的特殊类.例如文件管理中的NSUserDefault,应用程序中的UIApplication,整个应用程序就这一个单例类,负责应用程序的一些操作,单例在那个文件下都能取得到. 通过单例设计模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节省系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的选择. 下面来点实在的,创建单例代码上 方法1:基于线程安全创建一个单例 .h做一下声明 + (id)

设计模式之单例设计模式

一.何为单例设计模式 单例模式,顾名思义就是单个实例,程序中某个类只有一个实例存在.通常实在需要共享某个资源避免资源损耗的情况下使用到的. 二.单例设计模式的代码实现 一说到单例模式的概念,我们首先会想到下面的这种的写法 public class SingleInstance { private static SingleInstance singleInstance; /** * 单例模式 * @return */ public static SingleInstance getSingleI

设计模式整理_单例设计模式

单例设计模式,它确保一个类只有一个实例,并提供一个全局访问点. 由于单例设计模式对应的类只能创建一个对象,因此它所对应的方法必须是static(不是static只有创建对象才能调用). 以下是单例模式的一个经典实现:采用了延迟加载对象的例子. public class Single1 { private static Single1 single; //利用一个静态变量来记录Single1的唯一实例,这里没有直接声明,采用了延迟加载模式. private Single1(){} //把构造器声明

【学习笔记】单例设计模式笔记

单例设计模式是常见的设计模式之一.通过单例实现所需求类在系统中只存在唯一一个实例. 单例设计模式分两种:懒汉单例设计模式和饿汉单例设计模式,两者设计思路一致,实现有微小不同. 实现代码: 1 public class HungryMan { 2 3 private HungryMan(){};//私有的构造方法保证HungryMan类无法在外部使用构造方法实例化 4 private static final HungryMan hungryMan=new HungryMan();//在类内定义一

IOS开发之单例设计模式

本文将从四个方面对IOS开发中的单例设计模式进行讲解: 一.什么是单例设计模式 二.我们为什么要用单例设计模式 三.单例设计模式的基本用法 四.自定义单例设计模式代码的封装 一.什么是单例设计模式 所谓单例,即是单个的实例化对象,保证一个类有且仅有一个实例.通常情况下,当我们对一个类实例化时(如:alloc.new等),并不能保证每次实例化的对象是唯一的实例.那么为了保证该类可在多次实例化的过程中保证内存地址不变,就需要引入单例设计模式. 二.我们为什么要用单例设计模式 1.Singleton

Java——单例设计模式

设计模式:解决某一类问题最行之有效的方法.Java中23种设计模式:单例设计模式:解决一个类在内存中只存在一个对象. 想要保证对象唯一.1,为了避免其他程序过多建立该类对象.先禁止其他程序建立该类对象2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象.3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式 这三部怎么用代码体现呢?1,将构造函数私有化.2,在类中创建一个本类对象.3,提供一个方法可以获取到该类对象. 对于事物该怎么描述,还怎么描述.当需要将该事物的对象

OC中的单例设计模式及单例的宏抽取

1 // 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式 2 // 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 3 4 #pragma Person.h文件 5 6 #import <Foundation/Foundation.h> 7 @interface Person : NSObject <NSCopying,NSMutableCopying> 8 + (instancetype)sharePerson; // 给类提供一

微信 使用单例设计模式 提供AccessToken 和Jsapi_ticket缓存支持

上一篇 是使用ecache 做的缓存, 有些简单的微信项目并不需要这么复杂,So就想到单例设计模式  首先,我们先定义一个单例对象 import java.util.HashMap; import java.util.Map; /**  *   * @author wangiegie  * @date 2015年9月29日下午8:13:06  * @description  */ public class Singleton { //缓存accessToken 的Map  ,map中包含 一个a