什么是单例模式:表示一个类中只有一个实例存在
单例模式使用的好处:可以节省内存,因为它限制了实例的个数,有利于java垃圾回收
实际案例:
单例模式的三个重要的特点:
1、确保自己只有一个实例 2、单例类必须创建自己的实例 3、单例类必须为其它的对象提供唯一实例
常见单例模式的实现方式:懒汉单例类和饿汉单例类
懒汉单例类:我们可以这样理解,该对象非常懒,只有当外部对象第一次请求实例的时候才去创建实例。它在有需要实例的时候,才去判断自己是否已经创建了实例,如果没有,则自己创建一个实例,然后返回,如果存在则直接返回该实例
java实例代码:以下代码在多线程中可能会出现问题
public class SingtonTest {
private static SingtonTest sington;
private SingtonTest(){
}
public static SingtonTest getSington(){
if(sington==null){
sington= new SingtonTest();
}
return sington;
}
public static void main(String[] args) {
SingtonTest test1=SingtonTest.getSington();
SingtonTest test2=SingtonTest.getSington();
System.out.println(test1==test2);
}
}
饿汉单例类:我们可以这样理解,该单例类非常额,急需要补充食物,所以在类加载的时候就立即创建实例
java实例代码:
public class SingtonTest {
private static SingtonTest sington=new SingtonTest();
private SingtonTest(){
}
public static SingtonTest getSington(){
return sington;
}
public static void main(String[] args) {
SingtonTest test1=SingtonTest.getSington();
SingtonTest test2=SingtonTest.getSington();
System.out.println(test1==test2);
}
}
比较懒汉单例类和饿汉单例类的优缺点:
单例模式三个主要的作用:
第一:控制资源的使用,通过线程同步来控制资源的并发访问
第二:控制实例产生的数量,达到节约资源的目的
第三:作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
单例案例:
使用单例模式核心的一点是体现了面向对象封装性中的单一职责和对象自治的原则,当我们定义的类在很多地方需要new的时候,我们可以将类设置为单例类,把这个生成对象的的活交给类本身。实际上,配置信息类、管理类、控制类、门面类、代理类通常被设计为单例类,java中的struts、spring框架也大量使用了单例类。