java设计模式-- 单例模式

a 夏天 提交于 2019-11-27 09:20:29

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。

java的设计模式大致可以分为3大类,23种设计模式。

其中,创建型模式有5种:单例模式、建造者模式、原型模式、工厂模式、抽象工厂模式。

结构型模式有7种:设配器模式、装饰器模式、代理模式、外观模式、享元模式、组合模式、桥接模式。

行为模式一种有11种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

这23种设计模式并不是相互独立的,它们之间也有相互的联系。

本篇中要讲的是单例模式。

单例模式顾名思义,就是指本系统中只允许存在一个实例。它是一个比较基本的模式,我们日常设计中经常使用到的设计模式之一,比方说我们经常使用的线程池,缓存,对话框,打印机,日志对象,显卡等设备驱动,这类对象只能有一个势力,如果制作多个势力,就可能会导致一些问题。通过单例模式,我们可以方便对实例的个数进行控制从而节省一些系统开销。在单例模式中,我们有饿汉模式和懒汉模式。字面理解,饿汉模式就是肚子饿了,一开始就把单例创建出来了,懒汉模式就是肚子不饿,等到肚子饿时(系统调用)才去创建。 恶汉模式是线程安全的,懒汉模式因为在调用时创建,所以是非线程安排。
在创建单例模式时,我们一般都需要把构造方法私有化,然后再我们的类中声明一个静态方法,调用这个方法获取实例。

饿汉模式

hungrypattern 

/**
 * 饿汉模式
 * @author studyjun
 *
 */
public class HungryPattern {
     
         
    private static HungryPattern hPattern = new HungryPattern();
     
    private HungryPattern(){
         
    }
     
    public static HungryPattern getInstance(){
        return hPattern;
    }
}

懒汉模式

lazypattern 

/**
* 懒汉模式
* @author studyjun
*
*/
public class LazyPattern {
    private static LazyPattern lPattern = null;
     
    private LazyPattern(){
         
    }
     
    /**
     * 非线程安全
     * @return
     */
    public static LazyPattern getInstance(){
        if (lPattern==null) {
            lPattern = new LazyPattern();
        }
        return lPattern;
    }
     
     
    /**
     * 线程安全 ,效率比较差,可以修改,请看getInstance3
     * @return
     */
    public static synchronized LazyPattern getInstance2(){
        if (lPattern==null) {
            lPattern = new LazyPattern();
        }
        return lPattern;
    }
     
    /**
     * 使用“双重检查枷锁”,可以减少getInstance()使用同步,只有在lPattern为null时才进入线程同步
     * 这样就不用每次都进行线程同步,毕竟单例只需创建时同步就行。
     * 线程安全
     * @return
     */
    public static synchronized LazyPattern getInstance3(){
        if (lPattern==null) {
            synchronized(LazyPattern.class){
                if (lPattern==null) {
                    lPattern = new LazyPattern();
                }
            }
        }
        return lPattern;
    }
}

单例模式先说到这里,等有机会在多举一些例子完善


源码下载:SingletonSimple

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!