博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java常用的设计模式之单例模式
阅读量:5015 次
发布时间:2019-06-12

本文共 1728 字,大约阅读时间需要 5 分钟。

一、单例模式

单例模式的定义与特点

单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。

例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。

在计算机系统中,还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。

单例模式有 3 个特点:

  1. 单例类只有一个实例对象;
  2. 该单例对象必须由单例类自行创建;
  3. 单例类对外提供一个访问该单例的全局访问点;

单例模式是中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。

单例模式的主要角色如下。

  • 单例类:包含一个实例且能自行创建这个实例的类。
  • 访问类:使用单例的类     

单例模式的实现

Singleton 模式通常有两种实现形式。

实现方式 私有构造器 + 私有静态本身的实例 + 共有实例方法返回本身的实例

1、懒汉式单例

该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。代码如下:     

1 public class LazySingleton 2 { 3     private static volatile LazySingleton instance=null;    //保证 instance 在所有线程中同步 4     private LazySingleton(){}    //private 避免类在外部被实例化 5     public static synchronized LazySingleton getInstance() 6     { 7         //getInstance 方法前加同步 8         if(instance==null) 9         {10             instance=new LazySingleton();11         }12         return instance;13     }14 }

 

  注意:如果编写的是多线程程序,则不要删除上例代码中的关键字 volatile 和 synchronized,否则将存在线程非安全的问题。如果不删除这两个关键字就能保证线程安全,但是每次访问时都要同步,会影响性能,且消耗更多的资源,这是懒汉式单例的缺点。

2、饿汉式单例

该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。

1 public class HungrySingleton2 {3     private static final HungrySingleton instance=new HungrySingleton();4     private HungrySingleton(){}5     public static HungrySingleton getInstance()6     {7         return instance;8     }9 }

饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的,可以直接用于多线程而不会出现问题。

总结:最好的方式:

通过内部私有静态类来实现单例, 在这个类内部实例化一个static final的实例

然后用一个方法调用这个静态类的这个静态实例 他的优点就是结合了上头两种方式的所有优点, 即可以懒加载, 也可以保护线程安全,

 

转载于:https://www.cnblogs.com/yuansai/p/11453873.html

你可能感兴趣的文章
织梦DEDE多选项筛选_联动筛选功能的实现_二次开发
查看>>
iOS关于RunLoop和Timer
查看>>
SQL处理层次型数据的策略对比:Adjacency list vs. nested sets: MySQL【转载】
查看>>
已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
查看>>
MySQL的随机数函数rand()的使用技巧
查看>>
thymeleaf+bootstrap,onclick传参实现模态框中遇到的错误
查看>>
python字符串实战
查看>>
wyh的物品(二分)
查看>>
12: xlrd 处理Excel文件
查看>>
综合练习:词频统计
查看>>
中文url编码乱码问题归纳整理一
查看>>
Cesium应用篇:3控件(3)SelectionIndicator& InfoBox
查看>>
58. Length of Last Word(js)
查看>>
前端面试题汇总(持续更新...)
查看>>
如何成为F1车手?
查看>>
QT自定义消息
查看>>
Save (Not Permitted) Dialog Box
查看>>
装饰模式(Decorator)
查看>>
任务13:在Core Mvc中使用Options
查看>>
利用Excel 2010数据透视图实现数字的可视化的图形直观展示
查看>>