单例设计模式:
1、饿汉式
public class Demo {
public static void main(String[] args){
Singleton1 singleton1 = Singleton1.getSingleton1(); //通过类调用接口
singleton1.print();
}
}
class Singleton1{
private Singleton1(){}; //将构造方法私有化,外部不能new对象
private static Singleton1 singlenton1 = new Singleton1(); //使用静态存储方式,只存一个对象,当类被加载时,singleton1对象就被创建,一直放在内存中,直到程序结束;
public static Singleton1 getSingleton1(){ //将getSingleton1()方法设置为静态方法,让类可以调用,返回实例
return singlenton1;
}
public void print(){
System.out.println("测试");
}
}
2、懒汉式(优先考虑)
public class Demo {
public static void main(String[] args){
Singleton1 singleton1 = Singleton1.getSingleton1(); //通过类调用接口
singleton1.print();
}
}
class Singleton1{
private Singleton1(){}; //将构造方法私有化,外部不能new对象
private static Singleton1 singleton1; //声明一个静态的实例,只存一次
public static Singleton1 getSingleton1(){
if(singleton1==null){
singleton1 = new Singleton1(); //创建实例,在getSingleton()方法调用时创建,程序结束后释放,多线程存在问题
}
return singleton1;
}
public void print(){
System.out.println("测试");
}
}
补充:通过使用构造方法私有化,加静态方法代替单例,例如工具类中的Math
不需要创建对象,静态方法一直加载在内存中,直到程序退出
public class Demo {
public static void main(String[] args){
Singleton1.fun1(); //直接通过类调用方法
}
}
class Singleton1{
private Singleton1(){}; //将构造方法私有化,外部不能new对象
public static void fun1(){
System.out.println("方法一");
}
public static void fun2(){
System.out.println("方法二");
}
public static void fun3(){
System.out.println("方法三");
}
}
单例和使用静态方法代替单例对比
1、使用单例,当执行方法时,如果有定义的变量,方法进栈,执行完毕后,出栈,变量销毁,优点:省内存,缺点:需要反复的调用,耗时
2、静态方法代替单例:优点:调用的时间快,缺点:一直加载内存中,不能被销毁,比较占内存
原文:https://www.cnblogs.com/yanxiaoge/p/10661004.html