单例模式
- 设计模式概述
- 单例模式
- 实现思路
- 饿汉式
- 懒汉式
- 饿汉式 vs 懒汉式
设计模式概述
设计模式是在大量的实践中总结
和理论化
之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱。“套路”
经典的设计模式共有23种。每个设计模式均是特定环境下特定问题的处理方法。
单例模式
所谓单例模式就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法
实现思路
- 如果我们要让类在以恶个虚拟机中只能创建一个对象,我们必须将构造器的访问权限设置为private ,这样我们就不能在类外部用new来创建对象的实例,但是在类内仍然可以创建该对象的实例
- 因为我们的构造方法是private修饰的,所以我们在类的外部开始无法得到类的对象,只能调用该类的某个静态方法来通过返回值的方式来取得对象**,静态方法中只能访问类中的静态成员变量,所以,指向类内部产生的该类对象也必须定义成静态的.**
饿汉式
public class singleInstanceTest {
//类内部提供一个该类的实例
private static singleInstanceTest instanceTest = new singleInstanceTest();
//定义private修饰的构造器
private singleInstanceTest() {
}
//提供静态的get方法获取实例
public static singleInstanceTest getInstance() {
return instanceTest;
}
}
懒汉式
public class singleInstanceTest2 {
//创建时不实例化
private static singleInstanceTest2 single = null;
//私有化构造器
private singleInstanceTest2(){
}
//公共的get方法来获取实例
public static singleInstanceTest2 getInstance(){
//如果没有创建过实例则创建实例
if(single == null){
single = new singleInstanceTest2();
}
return single;
}
}
饿汉式 vs 懒汉式
饿汉式
- 特点: 立即加载,类在使用时就已经将对象创建完毕
- 优点: 实现简单 没有线程安全问题
- 缺点: 类被加载时会直接初始化static的实例,静态变量被创建并分配空间,从此以后,这这个static的实例便一直占用这一块内存,知道类被卸载时,静态变量才会被销毁,并且释放占用的内存,因此在特定情况下会`耗费内存
懒汉式
- 特点: `延迟加载``,在调用静态方法时实例才会被创建
- 优点: 实现起来比较简单;当类被加载的时候,static的实例未被创建并分配内存空间,当静态方法第一次被调用时,初始化实例变量,并分配内存,因此在某些特定条件下会
节约内存
。 - 在多线程环境中,这种实现方法是完全错误的,
线程不安全
,根本不能保证单例的唯一性。