- 单例设计模式
:保证一个类在内存中只有一个对象。
模式:模式就是解决一类问题的固定步骤。
模式的概念最早起源于建筑行业….
建房子的步骤都是一样子:
打地基----->浇柱子------->盖楼面--------->砌墙--------->封顶---->装修-----入住
软件行业中23种设计模式:
单例设计模式
模板设计模式
装饰者设计模式
观察者设计模式
工厂设计模式
单例设计模式的步骤:
- 懒汉单例设计模式:
- 私有化构造函数。
- 声明本类的引用类型变量,但是不要创建对象,
- 提供公共静态的方法获取本类的对象,获取之前先判断是否已经创建了本类对象,如果已经创建了,那么直接返回对象即可,如果还没有创建,那么先创建本类的对象,然后再返回。
懒汉代码:
public class Lazy {
public static void main(String[] args) {
// TODO Auto-generated method stub
Students stu=Students.getStudent();//创建了一个单例对象
Students stu1=Students.getStudent();
System.out.println(stu==stu1); //判断是否是单例对象
}
}
class Students{
private static Students students=null; //明本类的引用类型变量,但是不要创建对象,
private Students() { //私有化构造函数
}
/*
* 提供公共静态的方法获取本类的对象,
* 获取之前先判断是否已经创建了本类对象,
* 如果已经创建了,那么直接返回对象即可,
* 如果还没有创建,那么先创建本类的对象,然后再返回。
*/
public static synchronized Students getStudent() { //synchronized是解决多线程的问题
if(students==null) {
students=new Students();
}
return students;
}
}
运行结果:
true
- 饿汉单例设计模式
- 私有化构造函数。
- 声明本类的引用类型变量,并且使用该变量指向本类对象。
- 提供一个公共静态的方法获取本类的对象。
饿汉的单例代码实现:
public class Hunger {
public static void main(String[] args) {
// TODO Auto-generated method stub
Car car=Car.getCar(); //创建一个单例对象
Car car1=Car.getCar(); //创建其他的单例对象
System.out.println(car==car1); //判断这俩个单例对象是否相同
}
}
class Car{
private Car() { //私有化构造函数。
}
private static Car car=new Car(); //声明本类的引用类型变量,并且使用该变量指向本类对象。
public static Car getCar() { //提供一个公共静态的方法获取本类的对象。
return car;
}
}
运行结果:
true
推荐使用:饿汉单例设计模式。因为懒汉单例设计模式会存在线程安全问题,目前还不能保证一类在内存中只有一个对象。所以用synchronized,在一般的情况下使用恶汉模式。
- 饿汉和懒汉的区别:
1)饿汉是线程安全的,在类创建的时候就创建好了一个静态的对象让系统使用,以后也不会发生改变。—– 懒汉模式在创建实例的时候如果不加上 synchronized 就会导致对象的访问不是线程安全的
2)实现方式:懒汉是延时加载的,在需要的时候才会创建,但是饿汉模式是在虚拟机启动就创建,饿汉是不需要考虑线程安全的问题的,而且写的格式也比较简单。但实饿汉是在类加载的时候才创建对象,不管系统会不会用都会创建一个实例的对象,这就导致了内存的浪费。
3)与现实中的比较:
懒汉模式:一个人回家饿了,饭桌上有一个冷的馒头,当加热后你才会吃
饿汉模式:看到馒头是不管是不是热的都直接拿起来吃掉。