在好久以前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到不少的设计模式。java
java的设计模式大体能够分为3大类,23种设计模式。web
其中,建立型模式有5种:单例模式、建造者模式、原型模式、工厂模式、抽象工厂模式。设计模式
结构型模式有7种:设配器模式、装饰器模式、代理模式、外观模式、享元模式、组合模式、桥接模式。缓存
行为模式一种有11种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。安全
这23种设计模式并非相互独立的,它们之间也有相互的联系。app
本篇中要讲的是单例模式。wordpress
单例模式顾名思义,就是指本系统中只容许存在一个实例。它是一个比较基本的模式,咱们平常设计中常常使用到的设计模式之一,比方说咱们常常使用的线程池,缓存,对话框,打印机,日志对象,显卡等设备驱动,这类对象只能有一个势力,若是制做多个势力,就可能会致使一些问题。经过单例模式,咱们能够方便对实例的个数进行控制从而节省一些系统开销。在单例模式中,咱们有饿汉模式和懒汉模式。字面理解,饿汉模式就是肚子饿了,一开始就把单例建立出来了,懒汉模式就是肚子不饿,等到肚子饿时(系统调用)才去建立。 恶汉模式是线程安全的,懒汉模式由于在调用时建立,因此是非线程安排。
在建立单例模式时,咱们通常都须要把构造方法私有化,而后再咱们的类中声明一个静态方法,调用这个方法获取实例。spa
饿汉模式线程
/** * 饿汉模式 * @author studyjun * */ public class HungryPattern { private static HungryPattern hPattern = new HungryPattern(); private HungryPattern(){ } public static HungryPattern getInstance(){ return hPattern; } }
懒汉模式设计
/** * 懒汉模式 * @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