单例模式(singleton):每个类只允许一个实例,提供一个全局的访问点,即通过将其构造方法设计为private类型,使其无法通过new方法拿到其实例,只能通过类中定义的get方法拿到类的实例。其实现方案通常包括三种——懒汉式、饿汉式、final式,分析即实现如下:
1.:fina式
1.1 第一步:私有构造
1.2 第二步:定义公有静态成员类
package designPattern;
public class Demo01_SingletonFinal {
public static void main(String [] args) {
SingletonFinal singletonFinal = SingletonFinal.s;
}
}
class SingletonFinal{
private SingletonFinal() {}
public final static SingletonFinal s = new SingletonFinal();
}
2:饿汉式
2.1 第一步:私有构造
2.2 第二步:静态私有成员类
2.3 第三步:设置get
package designPattern;
public class Demo02_SingletonEH {
public static void main(String[] args) {
// TODO Auto-generated method stub
SingletonEH singletonEH = SingletonEH.getInstance();
}
}
//单例设计模式之饿汉式
class SingletonEH{
private SingletonEH() {} //私有构造
private static SingletonEH s = new SingletonEH(); //私有静态,保证不被修改
public static SingletonEH getInstance() {
return s;
}
}
3 懒汉式:懒汉式与饿汉式区别在于懒汉式在类的开头不会对成-员对象进行赋值,换言之,不会占用内存,等到需要使用成员对象(调用get()方法)时,在对这个成员对象进行赋值;
package designPattern;
public class Demo03_SingletonLH {
public static void main(String[] args) {
// TODO Auto-generated method stub
SingletonLH singleton1 = SingletonLH.getInstance();
SingletonLH singleton2 = SingletonLH.getInstance();
}
}
//单例设计模式之饿汉式
class SingletonLH{
private SingletonLH() {} //私有构造
private static SingletonLH s; //先不申请内存,等到使用时在进行申请
public static SingletonLH getInstance() {
if (s == null) {
s = new SingletonLH();
}
return s;
}
}
注:关于懒汉式与饿汉式区别:最大的区别在于多线程,懒汉式由于在第19-22行一直在操作s,当有多个线程时,可能存在第一个线程执行完19行时,CPU刚好切换至第二个线程,第二个线程也会执行至19行,进而创建两个SingletonLH对象,引发错误;其次一点区别在于懒汉式属于时间换空间,饿汉式属于时间换空间,故优先选择饿汉式;