设计模式学习笔记——单例模式
2016-05-05 19:12
344 查看
定义
单例模式(Singleton Pattern)是一个比较简单的模式,其定义如下:Ensure a class has only one instance, and provide a globalpoint of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)通用代码
public class Singleton { private static final Singleton instance = new Singleton(); // 限制产生多个对象 private Singleton() {} // 通过该方法获得实例对象 public static Singleton getInstance() { return instance; } public static void doSomething() { } }
优点
在内存中只有一个实例,不必频繁创建销毁,节约时空。避免对资源的多重占用
可以在系统设置全局的访问点
缺点
一般没有接口,扩展很困难在并行开发环境中,如果单例模式没有完成,是不能进行测试的
单例模式与单一职责原则有冲突
使用场景
在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反应”,可以采用单例模式。饿汉式和懒汉式
上述通用代码为“饿汉式单例”,在一开始便初始化instance。还有一种“懒汉式单例”,在首次调用getInstance时初始化对象,但在高并发的情况下会出现线程同步问题,产生两个instance,方法是加入关键字synchronized。实现代码如下:
public class Singleton { private static Singleton instance = null; // 限制产生多个对象 private Singleton() {} // 通过该方法获得实例对象 public static synchronized Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } public static void doSomething() { } }
注意事项
如果我们的一个单例对象在内存中长久不使用,JVM就认为这个对象是一个垃圾,在CPU资源空闲的情况下该对象会被清理掉,下次再调用时就需要重新产生一个对象。如果我们在应用中使用单例类作为有状态值(如计数器)的管理,则会出现恢复原状的情况,应用就会出现故障。如果确实需要采用单例模式来记录有状态的值,可以使用Spring框架中的bean让对象长久驻留内存。其他探究
饿汉式在类装载时就会加载对象,而懒汉式每次进入getInstance方法都需要同步,浪费了许多判断时间。有没有一种实现方法能够同时改进这两个缺点呢?我们可以利用JVM里的内部类来实现,保证线程安全性。代码如下:
public class Singleton { // 静态的成员式内部类,只有被调用到时才会加载 private static class SingletonHolder { private static Singleton instance = new Singleton(); } // 私有化构造方法 private Singleton() {} public static Singleton getInstance() { return SingletonHolder.instance; } public static void doSomething() { } }
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- c++ primer 第五版 笔记前言
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 那些年,我还在学习C# 学习笔记续
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby 魔法 学习笔记之一
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- sqlserver 数据库学习笔记
- C#编程中使用设计模式中的原型模式的实例讲解