单例设计模式:保证一个类只有一个实例对象,并提供一个访问他的全局访问点。
- 构造方法私有化
- 声明一个本类的对象
- 给外部提供一个静态的方法获取对象的实例
两种实现方式:
- 饿汉式:在类被加载后,对象被创建,到程序结束后释放
- 懒汉式 :在第一次调用getInstance方法时,对象被创建,到程序结束后释放
在项目中为什么使用单例,单例有什么好处?
- 在设计一些工具类的时候(通常工具类,只有功能方法,没有属性)不管多少个对象都一样
- 工具类可能会被频繁调用
目的:为了节省重复创建对象带来的内存消耗,从而提高效率
能不能使用构造方法私有化+静态方法来替代单例?
通常使用单例设计,因为他们的存储方式不同
构造方法私有化+静态方法:对象创建后会存在在静态方法区了,类被调用,对象就会被创建,占内存
单例设计模式:会new 一个对象,调用结束后就会释放内存
例子:
public class Singlo {
public static void main(String[] args) {
// Singleton1 s = new Singleton1(); //因为Singleton1已经被私有化
Singleton1 s = Singleton1.getInstance();
s.print();
Singleton1 s1 = Singleton1.getInstance();
s1.print();
System.out.println(s == s1);
Singleton2 s2 = Singleton2.getInstance();
s.print();
Singleton2 s3 = Singleton2.getInstance();
s1.print();
System.out.println(s2 == s3);
}
}
//饿汉式:占用内存时间长,提高效率
class Singleton1 {
// 私有构造方法
private Singleton1() {
}
// 创建一个静态对象
private static Singleton1 s = new Singleton1();
// 定义一个静态方法
public static Singleton1 getInstance() {
return s;
}
public void print() {
System.out.println("饿汉式测试方法");
}
}
//懒汉式:占用内存时间短,效率低(懒加载,延迟加载)用的时候在创建
class Singleton2 {
// 私有构造方法
private Singleton2() {
}
private static Singleton2 s;//并没有创建对象
// 定义一个静态方法
public static Singleton2 getInstance() {
if (s == null) {
s = new Singleton2();//调用的时候在创建对象
}
return s;
}
public void print() {
System.out.println("懒汉式测试方法");
}
}
//使用构造方法私有化+静态方法来实现工具类,比如Math
class Tools{
private Tools() {}
public static void print1() {
}
public static void print2() {
}
}