单例模式设计:保证一个类仅有一个实例,并提供一个访问它的全局访问点
1.构造方法私有化
2.声明一个本类对象
3.给外部提供一个静态方法获取对象实例
两种实现方式:
1.饿汉式 :在类被加载后,对象被创建,到程序结束后释放
2.懒汉式:在第一次调用getInstance方法时,对象被创建,到程序结束后释放
饿汉式占用内存的时间长,效率高;懒汉式占用内存的时间短,效率低,建议使用懒汉式!
在项目中,为什么使用单例,单例有什么好处?
1.在设计一些工具类的时候,通常工具类只有功能方法,没有属性,
2.工具类可能会被频繁调用
目的是为了节省重复创建对象所带来的内存消耗,从而来提高效率
能不能使用构造方法私有化+静态方法来替代单例呢?
能,但是效果没有单例模式节约内存空间
代码:
public class Demo {
public static void main(String[] args) {
//不能直接实例化Singleton1 S = new Singleton1();
// 只能
Singleton1 s1 = Singleton1.getInstance();
s1.print();
//一个对象,两个引用
Singleton1 s2 = Singleton1.getInstance();
s2.print();
System.out.println(s1 == s2);
Singleton2 s3 = Singleton2.getInstance();
s3.print();
Tools.print1();
Tools.print2();
}
}
//饿汉式
class Singleton1 {
//构造方法私有化
private Singleton1() {
}
//声明一个本类对象
private static Singleton1s =new Singleton1();
//给外部提供一个静态方法获取对象实例
public static Singleton1getInstance() {
return s;
}
public void print() {
System.out.println("测试方法");
}
}
//懒汉式
class Singleton2{
private Singleton2() {};
private static Singleton2s ;
public static Singleton2getInstance()
{
if(s==null)
{
s=new Singleton2();
}
return s;
}
public void print()
{
System.out.println("测试方法2");
}
}
//使用构造方法私有化+静态方法来实现工具类 ,比如Math
class Tools{
private Tools(){}
public static void print1()
{
System.out.println("1");
}
public static void print2()
{
System.out.println("2");
}
}
运行效果: