Java中的五种单例模式

简介: Java模式之单例模式: 单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。 特点:1,一个类只能有一个实例 2 自己创建这个实例3 整个系统都要使用这个实例 例: 在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。

Java模式之单例模式:
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:

  • 1,一个类只能有一个实例
    • 2 自己创建这个实例
    • 3 整个系统都要使用这个实例

例: 在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。 

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。一些资源治理器经常设计成单例模式。


外部资源:譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干个通信端口,系统应当集中治理这些通信端口,以避免一个通信端口被两个请求同时调用。内部资源,譬如,大多数的软件都有一个(甚至多个)属性文件存放系统配置。这样的系统应当由一个对象来治理这些属性文件。一个例子:Windows 回收站。

在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。 两种形式:

package singleton;  

/** 
 * @author lei 
 * 单例模式的五种写法: 
 * 1、懒汉 
 * 2、恶汉 
 * 3、静态内部类 
 * 4、枚举 
 * 5、双重校验锁 
 * 2011-9-6 
 */  
/** 
 *五、 双重校验锁,在当前的内存模型中无效 
 */  
class LockSingleton{  
        private volatile static LockSingleton singleton;  
        private LockSingleton(){}  

        //[详细](http://www.ibm.com/developerworks/cn/java/j-dcl.html)
        public static LockSingleton getInstance(){  
            if(singleton==null){  
                synchronized(LockSingleton.class){  
                    if(singleton==null){  
                        singleton=new LockSingleton();  
                    }  
                }  
            }  
            return singleton;  
        }  

    }  
/** 
 * 四、枚举,《Effective Java》作者推荐使用的方法,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象 
 */  
 enum EnumSingleton{  
        INSTANCE;  
        public void doSomeThing(){  
        }  
    }  
/** 
 * 三、静态内部类 优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading 
 */  
class InternalSingleton{  
        private static class SingletonHolder{  
            private final static  InternalSingleton INSTANCE=new InternalSingleton();  
        }     
        private InternalSingleton(){}  
        public static InternalSingleton getInstance(){  
            return SingletonHolder.INSTANCE;  
        }  
    }  
/** 
 * 二、恶汉,缺点:没有达到lazy loading的效果 
 */  
class HungrySingleton{  
        private static HungrySingleton singleton=new HungrySingleton();  
        private HungrySingleton(){}  
        public static HungrySingleton getInstance(){  
            return singleton;  
        }  
    }  
/** 
 * 一、懒汉,常用的写法 
 */  
 class LazySingleton{  
        private static LazySingleton singleton;  
        private LazySingleton(){  
        }  
        public static LazySingleton getInstance(){  
            if(singleton==null){  
                singleton=new LazySingleton();  
            }  
            return singleton;  
        }     
    } 
目录
相关文章
|
3月前
|
Java 编译器
单例模式---JAVA
“饿汉”模式 “懒汉”模式
101 1
|
6月前
|
设计模式 安全 Java
JAVA设计模式1:单例模式,确保每个类只能有一个实例
JAVA设计模式1:单例模式,确保每个类只能有一个实例
|
6月前
|
设计模式 存储 安全
【设计模式——学习笔记】23种设计模式——单例模式Singleton(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——单例模式Singleton(原理讲解+应用场景介绍+案例介绍+Java代码实现)
24 0
|
22天前
|
SQL 设计模式 安全
Java单例模式几种写法以及代码案例拿来直接使用
Java单例模式几种写法以及代码案例拿来直接使用
31 0
|
9天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
15 1
|
4月前
|
设计模式 Java
Java设计模式【一】:单例模式
Java设计模式【一】:单例模式
26 0
|
1月前
|
设计模式 安全 Java
Java设计模式之单例模式
在软件工程中,单例模式是一种常用的设计模式,其核心目标是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。Java作为一门广泛使用的编程语言,实现单例模式是面试和实际开发中的常见需求。
66 9
Java设计模式之单例模式
|
2月前
|
设计模式 Java 安全
[Java]单例模式
本篇文章主要阐述单例模式的基础实现,重心在于如何解决单例模式中的“线程安全”问题。不涉及理论。 如果文中阐述不全或不对的,多多交流。
80 0
[Java]单例模式
|
2月前
|
Java
JAVA基础--内部类和静态内部类、单例模式---静态内部类剖析
JAVA--内部类和静态内部类、单例模式---静态内部类剖析
38 9
|
2月前
|
存储 缓存 Java
Java volatile关键字-单例模式的双重锁为什么要加volatile
Java volatile关键字--单例模式的双重锁为什么要加volatile
51 10