黑马程序员--------单例设计模式
2015-01-27 16:49
155 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一. 为什么要使用单例设计模式?
可以保证一个类在内存中的对象唯一性。
比如,程序读取一个配置文件的时候,就可以把配置为文件封装成对象。当要求方便的操作其中的数据,又要保证多个程序读到的是同一个配置文件对象,就需要这个配置文件对象在内存中是唯一的
二. 怎样保证对象唯一性呢?
思路:
1. 让本类的构造函数私有化,这样其他的类就不可以创建本类对象。
2. 在本类中创建一个私有的本类对象。
3. 对外提供方法,让其他的类可以获取这个对象。
3. 单例设计模式的分类:
单例设计模式有两种,一种是懒汉设计模式(又称为延迟加载设计模式),一种是饿汉设计模式。
饿汉设计模式的代码体现如下:
由于外界无法创建Single对象,没有对象,那就无法调用getInstance方法,这时需要将getInstance方法静态化,这样外界就可以通过类名直接调用该方法。
懒汉模式:
三,总结:
懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。
饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。
从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式,我们推荐使用饿汉模式
在并发的情况下,懒汉式是不安全的。如果两个线程,我们称它们为线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if块,然后线程2进行控制,那么就会有两个实例被创建。
四,懒汉设计模式缺陷的解决方案:
我们可以使用线程锁来解决这个问题,代码反映如下:
一. 为什么要使用单例设计模式?
可以保证一个类在内存中的对象唯一性。
比如,程序读取一个配置文件的时候,就可以把配置为文件封装成对象。当要求方便的操作其中的数据,又要保证多个程序读到的是同一个配置文件对象,就需要这个配置文件对象在内存中是唯一的
二. 怎样保证对象唯一性呢?
思路:
1. 让本类的构造函数私有化,这样其他的类就不可以创建本类对象。
2. 在本类中创建一个私有的本类对象。
3. 对外提供方法,让其他的类可以获取这个对象。
3. 单例设计模式的分类:
单例设计模式有两种,一种是懒汉设计模式(又称为延迟加载设计模式),一种是饿汉设计模式。
饿汉设计模式的代码体现如下:
class Single { //私有本类中的构造函数 private Single(){} //创建本类对象 private static Single s= new Single(); //对外提供获取本来对象方法 public static Single getInstance() { return s; } }注意问题:
由于外界无法创建Single对象,没有对象,那就无法调用getInstance方法,这时需要将getInstance方法静态化,这样外界就可以通过类名直接调用该方法。
懒汉模式:
public class SingleDemo { public static voidmain(String[] args) { //获取Single类的实例对象s Single s = Single.getInstance(); //获取Single类的实例对象s2 Single s2 = Single.getInstance(); System.out.println(s==s2); //true } } class Single { //私有构造函数 private Single(){} //在本类中创建本类对象 private static Single instance = null; //对外提供静态访问方法,获取本类实例对象 public static Single getInstance() { if(instance == null ) // 这里会有线程安全问题 { instance = new Single(); } return instance; } }
三,总结:
懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。
饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。
从用户体验的角度来说,我们应该首选饿汉模式。我们愿意等待某个程序花较长的时间初始化,却不喜欢在程序运行时等待太久,给人一种反应迟钝的感觉,所以对于有重量级对象参与的单例模式,我们推荐使用饿汉模式
在并发的情况下,懒汉式是不安全的。如果两个线程,我们称它们为线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if块,然后线程2进行控制,那么就会有两个实例被创建。
四,懒汉设计模式缺陷的解决方案:
我们可以使用线程锁来解决这个问题,代码反映如下:
class Single { //私有构造函数 private Single(){} //在本类中创建本类对象 private static Single instance = null; //对外提供静态访问方法,获取本类实例对象 public static Single getInstance() { if(instance == null) { synchronized(Single.class) { if(instance == null ) { instance = new Single(); } } } return instance; } }
相关文章推荐
- 黑马程序员_IO流-装饰设计模式
- 黑马程序员:单例设计模式
- 黑马程序员_day06 面向对象(静态,对象的初始化和对象调用成员过程,单例设计模式)
- 黑马程序员---单例设计模式
- 黑马程序员---静态代码块、单例设计模式
- 黑马程序员_单例设计模式
- 黑马程序员-单例设计模式:懒汉式和饿汉式
- 黑马程序员-设计模式,继承和抽象类
- 黑马程序员-单例设计模式
- 黑马程序员-享元设计模式
- 黑马程序员 java学习笔记3-IO流之字节流与装饰设计模式
- 黑马程序员,延迟加载的单例设计模式
- 黑马程序员—2个设计模式
- 黑马程序员:一些简单的设计模式
- 黑马程序员 Java的设计模式——单例设计模式
- 黑马程序员———设计模式之——单例设计模式
- 黑马程序员—— 装饰设计模式
- 黑马程序员-面向对象之单例设计模式
- 黑马程序员:享元设计模式
- 黑马程序员:单态设计模式static(使类在内存只有一个实例对象)