七种常用的设计模式——单例模式

单例模式

单例工厂模式是JAVA中最简单的设计模式之一,提供了一种创建对象的最佳方式。

  • 意图:保证一个类仅有一个实例,并提供一个访问他的全局访问点。
  • 主要解决:一个全局使用的类频繁的创建和销毁。
  • 何时使用:当您想控制实例数目,节省系统资源的时候。
  • 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
  • 应用实例:一个班级只有一个班主任。
  • 优点:在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例,避免对资源的多重占用。
  • 缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

饿汉式(一出生就加载)

先看代码吧:


 - 优点:没有加锁,执行效率会提高。
 - 缺点:类加载时就初始化,浪费内存。

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

懒汉式(需要才会被加载)

改进后的懒汉式方法

public class LazySingleton{
    private volatile static EagerSingleton instance = null;
 
    private LazySingleton(){}
 
    public static LazySingleton getInstance(){//构造函数私有化 防止外部创建对象提供一个get方法 让外部通过该方法获取对象
    //因为构造函数私有 外部无法通过A a = new A();的方式来创建对象所以只能通过  类名.get();来获取对象
        //第一重判断
        if(instance==null){//只在创建的时候判断
            //锁定代码块
            synchronized(LazySingleton.class){//同步代码块,提升效率
                //第二重判断
                if(instance==null){
                    instance = new LazySingleton(); //创建单例实例
                }
            }
        }
        return instance;
    }
 
}

` 优点:第一次调用才初始化,避免内存浪费。线程安全
  缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
  
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  //必须加锁 synchronized 才能保证单例,但加锁会影响效率
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}

发布了5 篇原创文章 · 获赞 5 · 访问量 195

猜你喜欢

转载自blog.csdn.net/weixin_44318220/article/details/104443524