原文连接:设计模式–>单例设计模式
设计模式入门:单例设计模式
单例设计模式解决的问题:
jvm虚拟机内,只许创建一个对象(保证一个类仅有一个实例,并提供一个访问它的全局访问点)
就是说,只允许 此类,只能new一个对象!!!
设计思想:
)1:私有化默认构造器,不允许外界访问。
)2:设置外部静态访问对象。
)3:创建外部访问对象,并判断是否已经存在。
public class SingleModel {
/**
* 单例设计模型:
* 解决问题:在jvm虚拟机内,只许创建一个对象(保证一个类仅有一个实例,并提供一个访问它的全局访问点)
* <p>
* <p>
* 设计思想:
* 1、私有化默认构造器,不让外界无限访问创建
* 2、提供单个访问接口
* 3、首次创建对象类,采用懒加载
* <p>
* 优点:对外保证一个实例对象
* 缺点:多线程同时访问,可能造成多个实例
* <p>
* 应用场景:
* 参数、多出应用的参数、
* *
*/
private String name;
private String age;
private static SingleModel singleModel;
//私有化构造器:
//注意:一般开发中,如果要创建,设为public
private SingleModel() {
}
//创建外部访问对象
public static SingleModel getInstance() {
if (singleModel == null) {
//懒加载
return new SingleModel();
}
return singleModel;
}
//<请加上,get,set方法,这里省略>;
}
2、改进:变为线程安全实例
改进思想:在外部调用方法上加锁synchronized
产生新问题:每次加锁线程会产生上下文切换的开销
改进思想:判空处理
//创建外部访问对象
public static SingleModelSyn getInstance() {
//解决线程上下文切换,所产生的时间开销
if (singleModel == null) {
//加锁线程锁,解决多线程创建多个实例
synchronized (SingleModelSyn.class) {
if (singleModel == null) {
//懒加载
return new SingleModelSyn();
}
}
}
return singleModel;
}
/*//饿汉模式:以空间换时间做法
private static SingleModelProSyn singleModel = new SingleModelProSyn();
private SingleModelProSyn() {
}
public static SingleModelProSyn getInstance() {
return singleModel;
}*/
3、额外改进,创建自定义个实例
public class SingleModelPro {
/**
* 改进:单例创建多个单例对象
* *
*/
private String name;
private String age;
private static int maxNumberSingleModelProTow = 2;//最大创建数
private static int number = 1;//首次创建个数
//创建一个map集合,用来存储创建好的实例
public static Map<String, SingleModelPro> singleModelMap = new HashMap<>();
//私有化构造器:
private SingleModelPro() {
}
//创建外部访问对象
public static SingleModelPro getInstance() {
//直接获取静态key值
SingleModelPro singleModelPro = singleModelMap.get(number);
if (singleModelPro == null) {
//如果为空,new一个对象,number做key,对象做value
singleModelPro = new SingleModelPro();
singleModelMap.put(number + "", singleModelPro);
}
number++;
//循环在1-2之间
if (number > maxNumberSingleModelProTow) {
number = 1;
}
return singleModelPro;
}
//<请加上,get,set方法,这里省略>;
}
面向开发过程,记录学习之路。