单利模式:本来是不准备写的,但是最近发现好多公司面试时都会或多或少的提到单利模式,因此今天把单利模式拉出来说说。

定义:只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。(这是百度百科上的定义)

应用场景:是这样的,有些时候在程序的运行过程中,你不想要重复创建同一个类的多个对象(这回造成内存使用过量,对程序的性能不利),这是单利模式就是一个很好的选择,因为它能够保证程序运行时始终仅且仅有一个对象被创建。

优点:

1、控制资源的使用,通过线程同步来控制资源的并发访问;

2、控制实例产生的数量,达到节约资源的目的。

3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不

相关的两个线程或者进程之间实现通信。

单利模式的种类:

1.懒汉式

2.饿汉式

单利模式的特点:

1.单利只能有一个实例(即构造方法必须为私有的即private)

2.单利必须自己给自己创建一个能够保证唯一性的实例

3.单利必须提供一个共有的方法来返回它自己的唯一实例

饿汉模式介绍:

依据的原理:根据JLS(Java Language Specification)中的规定,一个类在一个ClassLoader中只会被初始化一次,这点是JVM本身保证的

因此创建后就不会有多例的问题。

优点:

  1.创建方便

  2.效率高  

缺点:

  1.对内存的使用量较大

应用场景:适用于小对象,对于过于大的对象就应该考虑适用懒汉时的了。

以下上饿汉模式的代码:

public class Singleton {
private Singleton(){}
private static final Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
} }

懒汉模式介绍:

懒汉模式,适用于所有的应用场景,但是要做过多的判断,相对来说它会影响程序的运行性能。

优点:

  1.适用于所有的应用场景

  2.使用时占内存较小(只有在使用的时候才会被创建)

缺点:

  1.性能较低

  2.书写较为繁琐

先看看一个简单的懒汉式例子:

    private Singleton(){}
private static Singleton instance = null;
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}

这段代码有什么问题呢?

对了,这段代码仅适用于单线程应用。对于多线程并发操作并没有做处理。这就会导致代码在运行是并不能保证程序中的对象在运行时始终是唯一的。

下面给出一个相对较好的单利模式:

private Singleton(){}//保证在类的外部对象并不会创建
private static Singleton instance = null;
public static Singleton getInstance(){//给外部提供一个范文自身的方法
if(instance == null){
synchronized (Singleton.class) {
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}

下面介绍一个对性能影响较小,又能保证内存使用量的单利模式

public class Singleton {
private Singleton(){}
//该类为静态私有内部类,只有外部类才能够调用
private static class PrivateSingleton{
//保证对象的唯一性。
static final PrivateSingleton instance = new PrivateSingleton();
}
public static PrivateSingleton getInstance(){
return PrivateSingleton.instance;
} }

以上这段代码,首先保证了该类的对象不会被外部类创建实例,而且解决了多线程并发的问题。

好了,单列模式就先介绍到这里。下面给大家一个链接,上面有单利的详细介绍,提供了6中单利的创建模式。有兴趣的朋友可以看看

http://www.iteye.com/topic/575052

Java中的单利模式介绍的更多相关文章

  1. Java中的单利模式

    单利模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...

  2. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  3. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  4. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  5. Java 设计模式之单利模式

    一.首先介绍一下单例模式:     单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局 ...

  6. Java设计模式之单利模式(Singleton)

    单利模式的应用场景: 单利模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例.并提供一个全局反访问点.单利模式是创建型模式.单利模式在生活中应用也很广泛,比如公司C ...

  7. 安卓中的Model-View-Presenter模式介绍

    转载自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0425/2782.html 英文原文:Introduction to M ...

  8. JAVA中的单利

    单列:单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种.单例模式有一下特点:1.单例类只能有一个实例.2.单例类必须自己自己创建自己的唯一实例.3.单例类必须给所有其他对象提供这一实例. 一.懒 ...

  9. Java中的代理模式

    代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...

随机推荐

  1. php生成word,并下载

    1.前端代码 <!DOCTYPE html> <html> <head> <title>PHP生成Word文档</title> <me ...

  2. ThinkPHP5事务回滚

    使用事务处理的话,需要数据库引擎支持事务处理.比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎. 使用 transaction 方法操作数据库事务,当发生异常会自动回滚 ...

  3. HTML初学小技巧

    01.让背景图不滚动IE浏览器支持一个 Body 属性 bgproperties,它可以让背景不滚动:〈Body Background="图片文件" bgproperties=&q ...

  4. 数据库批量操作中SqlParameter参数传递的问题

    数据库批量操作 比如会写:update T_AdminUsers set IsEnabled=@IsEnabled where Id in (@ids) 然后再SqlParameter("@ ...

  5. 安卓测试【一】android sdk环境变量配置

    移动应用自动化测试的配置,先于官网下载Android SDK,然后配置环境变量. 配置android sdk环境变量 1.  新建ANDROID_HOME环境变量,变量值为SDK解压的路径 2. 追加 ...

  6. Unity Profiler Memory

    当游戏出现闪退时很大概率是内存出现了问题,查找下代码中是否报错导致一直申请内存,还是申请的内存没有释放掉,比如图集等. 比如开着Profiler,一直开关界面看界面用到的图集是否被释放掉. 点击Mem ...

  7. Fiddler抓包使用教程-扫盲篇

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72823370 本文出自[赵彦军的博客] 1.什么是抓包? 不同主机之间的数据通信都 ...

  8. Python笔记(八):web开发

    #本文是在Windows环境下,Unix系统应该还要设置2个东西 (一)    采用MVC设计web应用 遵循   模型-视图-控制器(model-view-controlle) 模型:存储web应用 ...

  9. SQL2005的SSMS连接SQL2012会有问题

    SQL2005的SSMS连接SQL2012会有问题 如果用SQL2005的SSMS连接SQL2012会产生“索引数组越界”的问题并且使用不了 反过来使用SQL2012的SSMS连接SQL2005就没有 ...

  10. Oracle EBS INV 创建物料搬运单头

    CREATE OR REPLACE PROCEDURE XX_CreateMoveOrderHeader AS -- Common Declarations l_api_version NUMBER ...