设计模式-单例模式

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
比如说某类A将构造方法私有化,这样就不能在类A以外的地方创建类A的实例了,是否创建类A的实例只能由类A本身决定。虽然外界不能直接创建类A的实例,但是类A提供了一个方法(getInstance()),该方法返回一个类A的对象,使得外界可以获取类A的实例来使用。
简单来说就是一个类被计划生育了(没开放二胎,只准生一个),计划生育保证了程序运行期间始终只存在一个该类的实例。
我们都学过鲁迅的孔乙己,孔乙己对鲁迅说:你知道茴香豆的茴有几种写法吗?。其实单例模式也是有好几种写法的,不同的写法有不同的特点,下面介绍几种单例模式的写法。
一、饿汉式
public class SingleMan {
/**
* 饿汉式,当类加载的时候就创建该类的唯一对象,并且只创建一次。
*/
private final static SingleMan instance=new SingleMan();
/**
* 构造方法私有化,防止外部类创建该类的对象。
*/
private SingleMan(){}
/**
* 该类中获得该类对象的唯一方法
* @return instance
*/
public static SingleMan getInstance(){
return instance;
}
}
饿汉式,该方法利用了static关键字的属性,使得在该类加载的时候就创建该类的一个的实例。该方法保证了在程序运行期间只存在一个该类对象,也消除了并发的安全问题,缺点是在类加载时候就占用系统资源。
二、懒汉式
public class SinglePeople {
//懒汉式,对象的创建推迟到getInstance方法
private final static SinglePeople peopleInstance=null;
//构造方法私有化,外部类不能实例化该类
private SinglePeople(){}
/**
* 懒汉式,双重检查加锁
* @return peopleInstance;
*/
public static SinglePeople getInstance(){
//首先判断该实例是否存在,存在直接返回该类的对象
if(peopleInstance==null){
//使用synchronized保证线程安全
synchronized(SinglePeople.class){
//不存在创建实例
if(peopleInstance==null)
peopleInstance=new SinglePeople();
}
}
return peopleInstance;
}
public void method1(){
System.out.println("this is method1");
}
public void method2(){
System.out.println("this is method2");
}
}
getInstance方法保证了第一次调用被调用时创建它的实例。懒汉式中如果没有双重检查加锁的话,是线程不安全的,因为,如果当两个线程同时调用getInstance()方法并且此时peopleInstance此时为空,就有可能创建该类的多个对象。
三、使用静态内部类
public class SingleWomen {
/**
* 构造方法私有化
*/
private SingleWomen(){}
private static class SingleWomenHolder{
private static final SingleWomen instance=new SingleWomen();
}
public static SingleWomen getInstance(){
return SingleWomenHolder.instance;
}
}
延迟加载,当调用getInstance方法时才初始化SingleWomen,并且返回SingleWomen的一个对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值