设计模式之禅-单例模式

1.定义

    Ensure a class has only one instance, and provide a global point of access to it.

    确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

2.常用代码

    private class Singleton{

private static final Singleton singleton  = new Singleton();//创建一个不可更改的静态的Singleton对象。

private Singleton(){//私有构造器,外界无法new 出Singleton对象。

}

public static Singleton getInstance(){//获取singleton

return singleton;

}

public void doSometing(){

//逻辑处理

}

}

  优点:只有一个实例,减少了内存开支,特别是当一个对象需要频繁地创建,销毁时。

  缺点:单例模式没有接口,扩展很困难,对测试也不利。

  上面的例子在并发的情况下,会有线程安全的问题出现。解决方法是在获取Singleton对象的方法上加上synchronized。


3.获取固定数量的对象

    public class MutilSingleton{
private static Integer maxNum = 2;//指定固定数量
private static ArrayList<MutilSingleton>  list    =  new  ArrayList(); //容纳所有的MutilSingleton对象

static{ //初始化list集合
for(int i=0; i<maxNum; i++){

list.add(new MutilSingleton());

}

}
private MutilSingleton(){

}
public static MutilSingleton getInstance(){ //获取随意一个MutilSingleton实例

Random ran = new Random();

Integer index = ran.nextInt(maxNum);

return list.get(index);
}

public void doSomething(){

//逻辑处理
}

}

  同样地:该实例在并发情况下会出现线程不安全的问题,解决方法依然是在获取MutilSingleton实例的方法上添加synchronized关键字。

4.工厂模式下的单例模式

// 单例类
public class Singleton{

private Singleton(){

}
}

//工厂类

public class SingletonFacotry{

private static Singleton singleton;

static{//在类加载的时候初始化单例类,只会被加载一次。
try{
Class cls = Class.forName(singleton.getClass().getName());  //获得单例类的类加载器

Constructor   con =  cls.getDeclaredConstructor();
con.setAccessible(true);
singleton = (Singleton) con.newInstance();
}catch(Exception e){

e.printStackTrace();
}
}

public Singleton getInstance(){//给外部提供获取单例类的方法

return singleton;
}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值