单例模式/ java实现附代码 /

注: 场景和例子出自github的设计模式。传送门:https://github.com/iluwatar/java-design-patterns/tree/master/singleton

意图:

单例模式即使为了确保一个类只有一个实例,并提供一个全局访问点。

场景:

世界上只有一座象牙塔可以让巫师学习魔法,所有巫师都来到这座象牙塔进行修习。那么象牙塔就这里可以理解为单例。简单的来说就是只创建一个类的一个对象,这个象牙塔就可以理解为唯一对象。

实现:

想更好的理解单例模式,最好先了解一下java中的关键字Static。传送门:http://www.cnblogs.com/ahangBlogs/p/7719330.html

talk is cheap,show me the code.........................................................................................................................................................................................................................................(分割线)

列举几种单例模式的实现方法:

 一:

package Singleton;

public final class IvoryTower {
     private IvoryTower(){}

     private static final IvoryTower Instance=new IvoryTower();

     public static IvoryTower GetInstance(){
         return Instance;
     }
}

二:ThreadSafeLazyLoaded

package Singleton;
public final class ThreadSafeLazyLoadedIvoryTower {
      private static ThreadSafeLazyLoadedIvoryTower Instance;

      private ThreadSafeLazyLoadedIvoryTower(){
          if(Instance!=null){
              throw new IllegalStateException("Already initialized.");
          }
      }
      public static ThreadSafeLazyLoadedIvoryTower GetInstance(){
          if(Instance==null){
              Instance=new ThreadSafeLazyLoadedIvoryTower();
          }
          return Instance;
      }
}

三:线程安全双重锁检查

package Singleton;
public class ThreadSafeDoubleCheckLocking {
       private static ThreadSafeDoubleCheckLocking instance;

       private ThreadSafeDoubleCheckLocking(){
           if(instance!=null){
               throw new IllegalStateException("Already instance!");
           }
       }

       public static ThreadSafeDoubleCheckLocking GetInstance(){
           //使用局部变量可提高25%性能。 出自effectice java th2.. 简单来说就是局部变量保存在堆栈中....
           ThreadSafeDoubleCheckLocking result=instance;

           //检查单例模式的实力是否初始化,如果已经初始化就直接返回实例,没有初始化就往下走
           if(result==null){
               //实例没有初始化,不过我们不能确保在这个时间段其他线程是否初始化了这个实例, 所以为了确保正确我们得锁住一个对象来互相排斥。
               synchronized (ThreadSafeDoubleCheckLocking.class) {
                   //再次将是实例赋值给局部变量,这时候当前线程无法进入该锁空间,如果已经初始化我们返还实例
                   result=instance;

                   if(result==null){
                       //进入该if中,即没有在其他线程中进行初始化。那么我们可以安全的创建一个实例作为我们的单例实例。
                       instance=result=new ThreadSafeDoubleCheckLocking();
                   }
            }
           }
               return result;
       }

}

四:

package Singleton;

public enum EnumIvoryTower {
     INSTANCE;

     @Override
     public String toString(){
         return getDeclaringClass().getCanonicalName() + "@" + hashCode();
     }
}

适用性:

使用Singleton模式

  • 必须只有一个类的实例,并且必须可以从知名访问点访问客户端
  • 当唯一的实例应该通过子类来扩展时,客户端应该能够使用扩展实例而不修改它们的代

缺点:

  • 违反单一责任原则(SRP)通过控制自己的创作和生命周期。
  • 鼓励使用全局共享实例,以防止该对象使用的对象和资源被释放。
  • 创建紧密耦合的代码。Singleton的客户变得难以测试。
时间: 2024-10-14 10:03:52

单例模式/ java实现附代码 /的相关文章

观察者模式/ java实现附代码 /

/注:场景和例子引用github上的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/observer 场景: 一个天气预报系统,凡是订阅了改天气预报的,当天气发生改变的时候就把通知发送给所有订阅该天气预报的人.如兽人族(Orcs)和霍比特人(Hobitts)订阅了该天气预报系统,当天气从晴变成雨天的时候,兽人族和霍比特人就收到了天气变成雨天的通知. 如果还有其他订阅了该天气预报的如人族(Terran),只

Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明文是yanzi1225627,得到MD5加密后的字符串是:14F2AE15259E2C276A095E7394DA0CA9  但不能由后面一大串倒推出yanzi1225627.因此可以用来存储用户输入的密码在服务器上.现在下载文件校验文件是否中途被篡改也是用的它,原理参见:http://blog.c

【养孩子这么贵,还是生一个算了吧】设计模式之单例模式Java版

定义 单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点.所以在需要保证让一个类只有一个实例时,可以参考采用单例模式.通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.唯一的办法就是,让类自身负责保存它的唯一实例.这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法. 方法一 其一,不让其他类去实例化自己类的实例,那我们很容易想到可以通过定义一个private的构造函数.这是因为如果我们自定义了一个private的构造函数,那么系统默认的

Android NDK开发篇(五):Java与原生代码通信(数据操作)

尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用Java的引用类型则要做对应的处理. 一.对引用数据类型的操作 尽管Java的引用类型的实如今NDK被屏蔽了,JNI还是提供了一组API,通过JNIEnv接口指针提供原生方法改动和使用Java的引用类型. 1.字符串操作 JNI把Java的字符串当作引用来处理,在NDK中使用Java的字符串,须要相

java中静态代码块的用法 static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是

java 编程思想 22.11: java bean 案例代码

java 编程思想  22.11:   java bean 案例代码 thinking in java 4免费下载:http://download.csdn.net/detail/liangrui1988/7580155 package org.rui.swing.bean; import java.awt.Color; import java.awt.event.ActionListener; import java.awt.event.KeyListener; import org.rui.

(转)Java二进制指令代码解析

转自http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html Java二进制指令代码解析 Java源码在运行之前都要编译成为字节码格式(如.class文件),然后由ClassLoader将字节码载入运行.在字节码文件中,指令代码只是其中的一部分,里面还记录了字节码文件的编译版本.常量池.访问权限.所有成员变量和成员方法等信息(详见Java字节码格式详解).本文主要简单介绍不同Java指令的功能以及在代码中如何解析二进制指令. Ja

分享JAVA用户权限管理框架源代码JAVA权限管理java源代码框架代码,学习有帮助

JAVA用户权限管理框架源代码JAVA权限管理java源代码框架代码,用户功能权限控制到菜单以及菜单的操作按钮 MyEclipse+JDK1.6+apache-tomcat-6.0.14+SQL2005/2008/2012 是一套非常成熟的框架程序,可直接用于大型系统.基础框架快速开发,及程序员学习. .兼容 IE6,7,8,9 /Firefox /Google Chrome 这些浏览器都测试过 支持3级菜单导航. 框架包括用户管理.菜单管理.角色管理.权限管理.日志管理等功能. 内容包括源代码

分享下速卖通api的java的入门代码

package com.print.base; import java.io.*; import java.math.BigInteger; import java.net.URL; import java.net.URLEncoder; import java.util.*; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import net.sf.json.JSONArray; import net.sf.j