单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
那么,单例设计模式有什么好处呢? 在设计一些工具类的时候(通常工具类,只有功能方法,没有属性)比如java.lang.Math中的类 ,并且可能会被频繁调用,为了节省重复创建对象所带来的内存消耗,从而来提高效率
单例设计模式基本特点
1、构造方法私有化
2、在类中声明一个本类对象
3、给外部提供一个静态方法获取对象实例
分类:
1、懒汉式: 在第一次调用getXXX方法时,对象被创建,到程序结束后释放
2、饿汉式: 在类被加载后,对象被创建,到程序结束后释放
饿汉式: 占用内存的时间长,提高效率
public class Demo {
public static void main(String[] args) {
//Person person=new Person();在类外不能创建对象,因为构造方法私有化
Person.getPerson().test();
}
}
//饿汉式
class Person
{
private Person()
{
System.out.println("构造方法私有化");
}
public static Person person=new Person();
public static Person getPerson()
{
System.out.println("对外接口");
return person;
}
public void test(){
System.out.println("测试方法");
}
}
运行结果:
构造方法私有化
对外接口
测试方法
懒汉式: 占用内存的时间短,延迟加载,效率低,并且在多线程访问时会有安全问题
public class Demo {
public static void main(String[] args) {
//Person person=new Person();在类外不能创建对象,因为构造方法私有化
Person p1=Person.getPerson();
Person p2=Person.getPerson();
System.out.println("判断p1和person是否为同一个对象"+(p1==p2));
}
}
//懒汉式
class Person
{
private Person()
{
System.out.println("构造方法私有化");
}
public static Person person;
public static Person getPerson()
{
if (person==null)
{
new Person();
}
System.out.println("对外接口");
return person;
}
public void test(){
System.out.println("测试方法");
}
}
运行结果:
构造方法私有化
对外接口
构造方法私有化
对外接口
判断p1和person是否为同一个对象true