单例模式概述

先问个问题:

如何保证一个类只有一个实例并且这个实例易于被访问?

(1) 全局变量:可以确保对象随时都可以被访问,但不能防止创建多个对象
(2) 让类自身负责创建和保存它的唯一实例,并保证不能创建其他实例,它还提供一个访问该实例的方法

 

单例模式的定义

    确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。

要点:

  • 某个类只能有一个实例
  • 必须自行创建这个实例
  • 必须自行向整个系统提供这个实例

单例模式的结构

单例模式的实现

public class Singleton {
	private static Singleton instance=null;  //静态私有成员变量
     
      //私有构造函数
	private Singleton() {	
	}
	
       //静态公有工厂方法,返回唯一实例
	public static Singleton getInstance() {
		if(instance==null)
		    instance=new Singleton();	
		return instance;
	}
}

饿汉式单例与懒汉式单例

饿汉式单例类(Eager Singleton)

结构:


实现

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

 

懒汉式单例类(Lazy Singleton)
结构

实现

public class LazySingleton { 
private static LazySingleton instance = null; 
 
private LazySingleton() { } 
 //锁方法
synchronized public static LazySingleton getInstance() { 
if (instance == null) {
instance = new LazySingleton(); 
        }
return instance; 
}
}

饿汉式单例类与懒汉式单例类的比较

饿汉式单例类:无须考虑多个线程同时访问的问题;调用速度和反应时间优于懒汉式单例;资源利用效率不及懒汉式单例;系统加载时间可能会比较长
懒汉式单例类:实现了延迟加载;必须处理好多个线程同时访问的问题;需通过双重检查锁定等机制进行控制,将导致系统性能受到一定影响

 

单例模式优点

  • 提供了对唯一实例的受控访问
  • 可以节约系统资源,提高系统的性能
  • 允许可变数目的实例(多例类)

单例模式缺点

  • 扩展困难(缺少抽象层)
  • 单例类的职责过重
  • 由于自动垃圾回收机制,可能会导致共享的单例对象的状态丢失

单例模式适用环境

  • 系统只需要一个实例对象,或者因为资源消耗太大而只允许创建一个对象
  • 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值