单例模式---根据名字就可以想的到就是说,让一个类只有一个实例。
而且需要满足下面三个条件才属于单例模式:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
根据上述的条件的我们可以想到 通过静态的属性、通过一个静态的方法来创建给对象,让其可以通过方法名直接引用
简单实现如下:
package testDesignDemo.singleCase;
public class SingleCaseClass {
private static SingleCaseClass singleCase=new SingleCaseClass();
//私有化构造函数让其没法创建实例
private SingleCaseClass(){
}
//通过方法实例化
public static SingleCaseClass get(){
return singleCase;
}
}
package testDesignDemo.singleCase;
public class SingleCase {
public static void main(String[] args) {
SingleCaseClass singleCases=new SingleCaseClass();
SingleCaseClass singleCase=SingleCaseClass.get();
singleCase.printMessage();
}
}
第一句是错误的没法new
上面是其中一种实现方式 下面还有几种实现方式:
懒汉式(线程不安全)
package testDesignDemo.singleCase;
public class SingleCaseClass {
private static SingleCaseClass singleCase;
//私有化构造函数让其没法创建实例
private SingleCaseClass(){
}
//通过方法实例化
public static SingleCaseClass get(){
if(singleCase==null){
singleCase=new SingleCaseClass();
}
return singleCase;
}
//测试方法
public void printMessage(){
System.out.println("我是测试");
}
}
懒汉式(线程安全)package testDesignDemo.singleCase;
public class SingleCaseClass {
private static SingleCaseClass singleCase;
//私有化构造函数让其没法创建实例
private SingleCaseClass(){
}
//通过方法实例化
public static synchronized SingleCaseClass get(){
if(singleCase==null){
singleCase=new SingleCaseClass();
}
return singleCase;
}
//测试方法
public void printMessage(){
System.out.println("我是测试");
}
}
两者相比 就多在方法上面多加了一个 synchronized
修饰词
饿汉式 就是上述的例子:可以看到区别是:
private static SingleCaseClass singleCase=new SingleCaseClass();
也就是说在编译期类就已经加载了 耗内存
双重校验
package testDesignDemo.singleCase;
public class SingleCaseClass {
private volatile static SingleCaseClass singleCase;
//私有化构造函数让其没法创建实例
private SingleCaseClass(){
}
//通过方法实例化
public static SingleCaseClass get(){
if(singleCase==null){
synchronized(SingleCaseClass.class){
if(singleCase==null){
singleCase=new SingleCaseClass();
}
}
}
return singleCase;
}
//测试方法
public void printMessage(){
System.out.println("我是测试");
}
}
登记式/静态内部类public class SingleCaseClass
{
private static class SingletonHolder {
private static final Singleton INSTANCE = new SingleCaseClass();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
枚举
public enum SingleCaseClass {
INSTANCE;
public void whateverMethod() {
}
}