Java 设计模式学习1-单例模式

原创 2015年11月19日 09:24:45

从今天开始重新整理下Java设计模式的一些知识,好记性不如烂笔头。

文章内容并非原创,整理网络上的一些文章,方便自己查找

在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式。适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象。如Android中常见的Application对象。

通过单例模式,自行实例化并向这个系统提供这个单一实例的访问方法。

根据此单一实例产生的时机不同(当然,都是指第一次,也是唯一一次产生此单一实例时),可以将其分为懒汉式、饿汉式和登记式。

一、懒汉式:

其特点是延迟加载,即当需要用到此单一实例的时候,才去初始化此单一实例。常见经典的写法如下:

复制代码
 1 package com.qqyumidi;
 2 
 3 public class SingleTon {
 4 
 5     // 静态实例变量
 6     private static SingleTon instance;
 7 
 8     // 私有化构造函数
 9     private SingleTon() {
10 
11     }
12 
13     // 静态public方法,向整个应用提供单例获取方式
14     public static SingleTon getInstance() {
15         if (instance == null) {
16             instance = new SingleTon();
17         }
18         return instance;
19     }
20 
21 }
复制代码

 

二、饿汉式:

饿汉式的特点是应用中尚未需要用到此单一实例的时候即先实例化。常见的经典写法为:

复制代码
 1 package com.qqyumidi;
 2 
 3 public class SingleTon {
 4 
 5     // 静态实例变量,直接初始化
 6     private static SingleTon instance = new SingleTon();
 7 
 8     // 私有化构造函数
 9     private SingleTon() {
10 
11     }
12 
13     // 静态public方法,向整个应用提供单例获取方式
14     public static SingleTon getInstance() {
15         return instance;
16     }
17 
18 }
复制代码

 

三、登记式单例模式:

登记式单例模式,一般是通过一个专门的类对各单例模式的此单一实例进行管理和维护。通过Map方式可以方便的实现此中目的。常见的代码如下

复制代码
 1 package com.qqyumidi;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 public class SingleTonManager {
 7 
 8     private static Map singleTonMap = new HashMap();
 9 
10     public static void main(String[] args) {
11         // 获取A类的单例
12         A a = (A) getInstance(A.class.getName());
13         // 获取B类的单例
14         B b = (B) getInstance(B.class.getName());
15     }
16 
17     // 根据类型获取单例
18     public static Object getInstance(String className) {
19         // 判断singleTonMap中是否有此单例,有则取得后返回,无则添加单例后返回
20         if (!singleTonMap.containsKey(className)) {
21             try {
22                 singleTonMap.put(className, Class.forName(className).newInstance());
23             } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
24                 // TODO Auto-generated catch block
25                 e.printStackTrace();
26             }
27         }
28         return singleTonMap.get(className);
29     }
30 }
31 
32 class A {
33 
34 }
35 
36 class B {
37 
38 }
复制代码

 

另外:需要注意的是,在多线程环境中,以上各种方法构造单例模式需要考虑到线程安全问题。

 

四、改进型懒汉式(直接满足线程安全)——通过静态内部类实现

在如上的懒汉单例模式中,对于多线程环境中。可以通过常见的如synchronized等方式实现线程安全,同时,可以通过Java静态内部类的方式实现进一步改进。

常见代码如下:

 

复制代码
 1 package com.qqyumidi;
 2 
 3 public class SingleTon {
 4 
 5     // 利用静态内部类特性实现外部类的单例
 6     private static class SingleTonBuilder {
 7         private static SingleTon singleTon = new SingleTon();
 8     }
 9 
10     // 私有化构造函数
11     private SingleTon() {
12 
13     }
14 
15     public static SingleTon getInstance() {
16         return SingleTonBuilder.singleTon;
17     }
18 
19     public static void main(String[] args) {
20         SingleTon instance = getInstance();
21     }
22 }

其主要原理为:
Java中静态内部类可以访问其外部类的成员属性和方法,同时,静态内部类只有当被调用的时候才开始首次被加载,利用此特性,可以实现懒汉式,在静态内部类中静态初始化外部类的单一实例即可。

五、
双重校验锁 (Double Check Lock)
 
/**
 * @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;
    }
     
}




 说明: 第一个singleton==null判断避免不必要的线程同步


参考:

1、 http://www.oschina.net/code/snippet_107039_6062

2、 http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html


学习笔记——JAVA设计模式<1>单例模式

Group of four GFO23种设计模式 创建型模式建对象 单例模式 工厂模式 抽象工厂模式 建造者模式原型模式 结构性模式 适配器模式 桥接模式 装饰模式 组合模式...

java设计模式学习笔记1 单例模式

单例模式:指的是类 只能由自己生成唯一一个对象实例,并向其他对象提供这一实例。 实现单例模式有三种方法;常用的是所谓懒汉模式,与饿汉模式 1饿汉式:即在类在初始化的时候就已经自行实例化: publ...

Java设计模式(1) 单例模式

Java设计模式(1) 单例模式1. 分类 延迟初始化的单例模式 enum实现 内部类实现 双重加锁实现 非延迟初始化的单例模式 2. 非延迟初始化的单例模式class Singleton { ...

1. Java设计模式--单例模式

概念:   java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、 枚举式单例三种。   单例模式有一下特点:   1、单例类只能有一个实例。   2、单例类必须自己...

java设计模式1 单例模式

设计模式的目的:是经验总结,为了可重要代码。 分为三类:创建者模式: 单例  工厂方法  抽象工厂  建造者  原型     结构型模式: 适配器  装饰器  代理        桥接 组合 享元  ...

Java设计模式(1):单例模式

单例模式是常用的程序设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只能new一个对象,通过将构造方法限定为private,避免了类在外部被实例化,在同一个虚拟...
  • bwf_erg
  • bwf_erg
  • 2017年05月02日 23:37
  • 69

java基础之设计模式(1)--单例模式

先贴出一些概念,对后面的讲解有一定帮助 JMM(java内存模型) 根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线...

java设计模式(1)--单例模式

(一)单例模式 要点:(1)各个类都只有一个实例。(2)它必须自行创建这个唯一实例。(3)它必须自行向其他对象提供该实例。本质:控制实例的数量。应用场景:线程池、缓存、日志对象、对话框、打印...
  • czw2010
  • czw2010
  • 2012年10月20日 11:18
  • 12403

java设计模式之单例模式(1)

单例模式:属于创建型模式。项目中只存在某个类的一个对象,而且只可能存在一个对象。那么我们说这个类是单例模式,也叫单态模式。 单例模式分为两种 :懒汉式 和 饿汉式。 饿汉式...

JAVA设计模式(1)----单例模式

这几天计划系统的学习一下设计模式,今天先回顾一下最基本的一种设计模式----单例模式。 单例模式: 定义是单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 设计模式学习1-单例模式
举报原因:
原因补充:

(最多只允许输入30个字)