本文属于系列文章《设计模式》,附上文集链接
单例模式定义
- 确保对象在内存中有且只有一个,并自行实例化为系统提供这个实例。
- 这个模式在我们只需要一个创建一个对象,避免重复创建对象的时候使用,比如说配置文件,工具类,缓存,线程池,日志对象等等
- 单例模式属于创建类模式
实现方式一 饿汉模式
//1.将构造函数私有化
private SingleTon(){ }
//2、内部调用构造函数创建对象,对象声明为私有属性
// (饿汉模式的命名由此而来,因为SingleTon对象是static的,在加载SingleTon类的时候,instance对象就会被创建,无论有没有使用该对象,都会创建对象,就像饿汉去餐厅吃饭,无论吃不吃,先点了再说 )
// final关键字确保该实例对象是内存中有且只有一个
private final static SingleTon instance = new SingleTon();
//3、提供方法获取singleTon实例
public static SingleTon getInstance(){
return instance;
}
分析
将实例声明为static属性,在类被加载的时候就会创建实例,final属性确保了对象的唯一性。
实现方式二 懒汉模式
//1.将构造函数私有化
private SingleTon(){ }
// 2.2、声明一个SingleTon对象,注意,是声明
private static SingleTon instance = null;
//3、提供方法获取singleTon实例
public static SingleTon getInstance(){
return instance;
}
分析
这个一般叫做懒汉模式,因为是懒加载嘛,只有对象要被使用的时候才会实例化,但是这里就有一个问题了,假设在多线程的情况下,就会容易会创建多个实例,这不符合单例模式的定义,所以修改下
绝对安全的懒汉模式
//1.将构造函数私有化
private SingleTon(){ }
// 2.2、声明一个SingleTon对象,注意,是声明
private static SingleTon instance = null;
// 3 在之前的基础上增加了synchronized关键字和一个instance判空
public static synchronized SingleTon getInstance(){
if(instance == null){
Thread.sleep(1000);
instance = new SingleTon();
}
return instance;
}
单例模式扩展:指定数量的对象
哈哈,在书上看到的,虽然不知道能不能用上,但是当做活跃下思维吧,觉得挺好玩的。
// 单例类
public class Singleton {
private Singleton(String name){
nameList.add(name);
}
// 对象的最大个数
private static int maxNumOfSingleton = 3;
//定义对象列表
private static ArrayList<Singleton> singletonList = new ArrayList<Singleton>();
// 定义对象的名字列表,方便知道是哪个对象
private static ArrayList<String > nameList = new ArrayList<>();
//当前对象的序号
private static int countNum;
static{
// 实例化
for(int i = 1;i<=maxNumOfSingleton;i++){
singletonList.add(new Singleton(i +"号对象"));
}
}
public static Singleton getInstance(){
countNum = new Random().nextInt(maxNumOfSingleton);
return singletonList.get(countNum);
}
public void say(){
System.out.println("我是"+nameList.get(countNum));
}
}
// 场景
public class Client {
public static void main(String[] args) {
for(int i =0;i<5;i++){
Singleton.getInstance().say();
}
}
}
结果:
我是3号对象
我是3号对象
我是1号对象
我是2号对象
我是1号对象
以上就是单例模式