定义

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例 。

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需 要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让 类的实例去生成另一个唯一实例毫无意义。

其又分为三种形式

饿汉式

//只有内部类可以为static。
public class SingIn{
//在自己内部定义自己的一个实例,只供内部调用
private static final SingIn instance = new SingIn();
private SingIn(){
}
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static SingIn getInstance(){
return instance;
}
}

懒汉式

   /***
* 一种常用的形式
*/
private static SingIn instance = null;
public static synchronized SingIn getInstance() {
// 这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
// 使用时生成实例,提高了效率!
if (instance == null)
instance = new SingIn();
return instance;
}

双重锁式

//将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
private static volatile SingIn instance=null;
private SingIn (){ }
public static SingIn getInstance(){
if(instance==null){
synchronized(SingIn .class){
if(instance==null){
instance=new SingIn ();
}
}
}
return instance;
}

使用方式,直接调用getInstance()方法即可得到对象。

优点

实例控制:Singln 会阻止其他对象实例化其自己的 Singln 对象的副本,从而确保所有对象都访问唯一实例

灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程

缺点

开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销,可以通过使用静态初始化解决此问题。

可能的开发混淆:使用 Singln 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

对象的生存期:Singln 不能解决删除单个对象的问题。

最新文章

  1. JSTL标签使用说明
  2. 源码阅读笔记 - 1 MSVC2015中的std::sort
  3. Windows事件ID大全
  4. javascript仿天猫加入购物车动画效果
  5. Nginx HA 及https配置部署
  6. JAVA导出数据到excel中大数据量的解决方法
  7. UTF-8
  8. linux命令(4):top 命令(性能分析工具)
  9. 升级 CentOS git 1.7.1 到 1.7.12
  10. asp.net创建XML文件方法
  11. SSL与TLS的区别以及介绍
  12. 谈谈分布式事务之一:SOA需要怎样的事务控制方式
  13. javascript string对象的属性与方法
  14. 如何让input框显示在一行?
  15. lua的table元类
  16. Nginx代理MysqlCluster集群
  17. CentOS7通过rsync+crontab实现两台服务器文件同步
  18. 在阿里云Ubuntu 14.04 Linux服务器上安装docker
  19. E: Unable to locate package openjdk-8-jdk 及java version 切换
  20. os.mkdir()和os.path.join()的区别

热门文章

  1. mvn deploy 推送到私有仓库,注意当前日期
  2. VMWare中桥接、NAT、Host-only
  3. linux常用命令:watch 命令
  4. 2018-2019-2 20165209 《网络对抗技术》 Kali安装
  5. Linux基础命令---gzip
  6. Python入门之Python中的logging模块
  7. jquery的click无法触发事件
  8. HTML 语义化标签-新增标签介绍
  9. 01: git & github
  10. QTQuick控件基础(3)视图