单例中的懒汉与饿汉
来源:互联网 发布:mac版录音 编辑:程序博客网 时间:2024/06/10 07:35
首先对单例模式的懒汉式与饿汉式进行简单介绍:
1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建。
2、懒汉式:当程序第一次访问单件模式实例时才进行创建。
单例模式用途:
单例模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用。
单例模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例。它的用途十分广泛,打个比方,我们开发了一个简单的留言板,用户的每一次留言都要将留言信息写入到数据库中,最直观的方法是没次写入都建立一个数据库的连接。这是个简单的方法,在不考虑并发的时候这也是个不错的选择。但实际上,一个网站是并发的,并且有可能是存在大量并发操作的。如果我们对每次写入都创建一个数据库连接,那么很容易的系统会出现瓶颈,系统的精力将会很多的放在维护连接上而非直接查询操作上。这显然是不可取的。
如果我们能够保证系统中自始至终只有唯一一个数据库连接对象,显然我们会节省很多内存开销并且提高cpu利用率。这就是单例模式的用途。当然单例模式不仅仅只用于这样的情况。在《设计模式:可复用面向对象软件的基础》一书中对单例模式的适用性有如下描述:
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2、当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
关于Instance类应该如何设计:
如上面叙述,我们保证单件模式类是我们取得单件实例的唯一访问点。那么我们应该保证在程序中尽量避免允许创建Instance实例。
通过将构造函数声明为private可以防止程序员通过new关键字调用构造上函数创建对象。并且在Instance类中创建getXXX()方法调用构造函数并返回具体Instance实例。具体代码如下:
1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建。
2、懒汉式:当程序第一次访问单件模式实例时才进行创建。
如何选择:如果单件模式实例在系统中经常会被用到,饿汉式是一个不错的选择。
反之如果单件模式在系统中会很少用到或者几乎不会用到,那么懒汉式是一个不错的选择。
代码如下:
class Instance{}//懒汉式class LSingle{private static Instance _instance = null; private LSingle(){}public static Instance getInstance(){if(_instance==null){synchronized(LSingle.class){_instance = new Instance();}}return _instance;}}//饿汉式class ESingle{private static Instance _instance = new Instance();private ESingle(){}public static Instance getInstance(){return _instance;}}
单例模式用途:
单例模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用。
单例模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例。它的用途十分广泛,打个比方,我们开发了一个简单的留言板,用户的每一次留言都要将留言信息写入到数据库中,最直观的方法是没次写入都建立一个数据库的连接。这是个简单的方法,在不考虑并发的时候这也是个不错的选择。但实际上,一个网站是并发的,并且有可能是存在大量并发操作的。如果我们对每次写入都创建一个数据库连接,那么很容易的系统会出现瓶颈,系统的精力将会很多的放在维护连接上而非直接查询操作上。这显然是不可取的。
如果我们能够保证系统中自始至终只有唯一一个数据库连接对象,显然我们会节省很多内存开销并且提高cpu利用率。这就是单例模式的用途。当然单例模式不仅仅只用于这样的情况。在《设计模式:可复用面向对象软件的基础》一书中对单例模式的适用性有如下描述:
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2、当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
关于Instance类应该如何设计:
如上面叙述,我们保证单件模式类是我们取得单件实例的唯一访问点。那么我们应该保证在程序中尽量避免允许创建Instance实例。
通过将构造函数声明为private可以防止程序员通过new关键字调用构造上函数创建对象。并且在Instance类中创建getXXX()方法调用构造函数并返回具体Instance实例。具体代码如下:
class Instance{private Instance(){}public static Instance getSelf(){return new Instance();}}//懒汉式class LSingle{private static Instance _instance = null; private LSingle(){}public static Instance getInstance(){if(_instance==null){synchronized(LSingle.class){_instance = Instance.getSelf();}}return _instance;}}//饿汉式class ESingle{private static Instance _instance = Instance.getSelf();private ESingle(){}public static Instance getInstance(){return _instance;}}
0 0
- 单例中的懒汉与饿汉
- 单例模式中的懒汉模式和饿汉模式
- 单例模式(懒汉模式与饿汉模式)
- 单例模式之 --饿汉模式与懒汉模式
- Java 单例模式【懒汉与饿汉】
- 设计模式:单例模式,懒汉与饿汉
- 设计模式:单例中的 饿汉式 与懒汉式
- 单例模式中的饿汉式与懒汉式
- 单例模式中的饿汉式与懒汉式
- 单例设计模式-懒汉饿汉
- Java中的单例设计模式之饿汉模式、懒汉模式
- 单例模式中的懒汉模式和饿汉模式的最优写法
- C++中的单例模式(懒汉模式、饿汉模式及线程安全问题)
- 【单例模式】——饿汉模式与懒汉模式及其区别
- 单例模式之懒汉模式与饿汉模式的对比
- 单例设计模式(饿汉模式与懒汉模式)
- Java单例模式之饿汉模式与懒汉模式
- 单例模式的两种方式:饿汉模式与懒汉模式
- 应用层
- nginx学习之旅(一)nginx环境准备与安装
- 马士兵struts2视频教程第十三集
- 搭建redmine
- HTTP接口跟UDP接口流量差异比较
- 单例中的懒汉与饿汉
- 浅谈CSRF攻击方式
- POJ-3345(树形DP)
- Godaddy VPS初始化配置
- 第四章、TIny4412 U-BOOT移植四 配置时钟频率源码分析
- DOM window.location.href 和 navigate()
- 看淡你的权力
- Javascript 面向对象编程(一):封装
- Android中数据的存储之------SharedPreferences存储数据