一、学前三问
1.什么是单例模式?
单例模式指的是:保证类在内存中只有一个实例对象。
2.如何保证类在内存中只有一个对象呢?
(1)控制类的创建,不让其他类来创建本类的对象.private
(2) 在本类中定义一个本来对象。Singleton s;
(3) 提供公共的访问方式:pubic static Singleton getInstance(){}
3.单例模式的常见方法
(1)饿汉式
(2) 懒汉式
(3) 自创式
二、代码实践
1.饿汉式:
//饿汉式
class Singleton {
//1.私有构造方法,其他类不能使用该构造方法
private Singleton(){
}
//2.创建本类对象,加上static
private static Singleton s=new Singleton();
//3.对外提供公共的访问方法,获取对象实例
public static Singleton getInstance(){
return s;
}
}
//创建一个main方法进行测试:
public static void main(String[] args) {
Singleton s1 =Singleton.getInstance();
Singleton s2 =Singleton.getInstance();
System.out.println(s1==s2);//结果是true(保证了统一个对象的操作)
}
2.懒汉式
//懒汉式,声明引用,开始不创建对象,给他一个判断方法。(面试的时候用)单例的延迟加载模式
class Singleton{
//1.私有构造方法
private Singleton(){
}
//2.声明一个本类的引用
private static Singleton s;
//3.对外提供公共的访问方法
public static Singleton getInstance(){//刚开始先不创建对象
if(s==null) {
s = new Singleton();
}
return s;
}
}
//创建一个main方法进行测试:
public static void main(String[] args) {
Singleton s1 =Singleton.s; //成员变量被私有,不能通过类名.进行调用
Singleton.s=null;
Singleton s2 =Singleton.s;
System.out.println(s1==s2);//结果是true(在Singleton.s!=null的前提之下)
}
3.自创式:
//第三种模式
class Singleton{
//1.私有构造方法
private Singleton(){
}
//2.public静态声明创建对象
public static final Singleton s=new Singleton();//被final修饰方式
}
//创建一个main方法进行测试:
public static void main(String[] args) {
Singleton s1 =Singleton.s; //成员变量被私有,不能通过类名.进行调用
Singleton s2 =Singleton.s;
System.out.println(s1==s2);//结果是true
}
三、区别
饿汉式和懒汉式以及自创式的区别
- 饿汉式是以时间换空间的方法(无论是否需要对象,上来直接创建对象但是会占用空间)
- 懒汉式是时间换空间,比较慢(因为要增加了是否要创建对象的判断操作)
- 在多线程访问时,饿汉式不会创建多个对象,但是懒汉式有可能会创建多个对象。(在进行判断的时候会出现这种状况)
- 自创式代码简单,在使用public静态声明创建对象的时候加上final关键字进行修饰即可达到同等效果
总结:
单例模式做的事就是为了控制类对象的唯一性,使用场景在java的runtime类中的体现最为直接。思路:private私有化构造方法,在类中私有类创建对象并且创建一个方法给予其他类中进行访问操作。就是这么简单!!!