单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
要实现单例,需要:
1、构造方法私有化
2、声明一个本类对象
3、给外部提供一个静态方法获取对象实例
两种实现方式:
1、饿汉式
2、懒汉式
饿汉式:
public class Demo1{
public static void main(String args[]){
Singleton1 s = Singleton1.getInstance();
s.print();
Singleton1 s1 = Singleton1.getInstance();
s1.print();
System.out.println(s==s1);
}
}
//饿汉式
class Singleton1{
private Singleton1() {}
private static Singleton1 s =new Singleton1();//直接new一个对象
public static Singleton1 getInstance() {
return s;
}
public void print() {
System.out.println("测试方法");
}
}
输出结果:
测试方法
测试方法
true
懒汉式:
public class Demo2{
public static void main(String args[]){
Singleton2 s = Singleton2.getInstance();
s.print();
Singleton2 s2 = Singleton2.getInstance();
s2.print();
System.out.println(s==s2);
}
}
//懒汉式
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("测试方法2");
}
}
输出结果:
测试方法2
测试方法2
true
对比:
懒汉式:在第一次调用getInstance
方法时,对象被创建,到程序结束后释放。占用内存的时间相对短,效率相对低。
饿汉式:在类被加载后,对象被创建,到程序结束后释放。占用内存的时间相对长,效率相对高。
建议用懒汉式。
在项目中为什么要使用单例,单例有什么好处?
在设计一些工具类的时候使用(通常工具类只有功能和方法,没有属性),因为工具类可能会被频繁调用。能节省重复创建对象所带来的内存消耗,从而提高效率。
//使用构造方法私有化 + 静态方法来实现工具类,比如 Math
class Tools{
private Toolos() {}
public static void print1() {
}
public static void print2() {
}
}