在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。
java的设计模式大致可以分为3大类,23种设计模式。
其中,创建型模式有5种:单例模式、建造者模式、原型模式、工厂模式、抽象工厂模式。
结构型模式有7种:设配器模式、装饰器模式、代理模式、外观模式、享元模式、组合模式、桥接模式。
行为模式一种有11种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
这23种设计模式并不是相互独立的,它们之间也有相互的联系。
本篇中要讲的是单例模式。
单例模式顾名思义,就是指本系统中只允许存在一个实例。它是一个比较基本的模式,我们日常设计中经常使用到的设计模式之一,比方说我们经常使用的线程池,缓存,对话框,打印机,日志对象,显卡等设备驱动,这类对象只能有一个势力,如果制作多个势力,就可能会导致一些问题。通过单例模式,我们可以方便对实例的个数进行控制从而节省一些系统开销。在单例模式中,我们有饿汉模式和懒汉模式。字面理解,饿汉模式就是肚子饿了,一开始就把单例创建出来了,懒汉模式就是肚子不饿,等到肚子饿时(系统调用)才去创建。 恶汉模式是线程安全的,懒汉模式因为在调用时创建,所以是非线程安排。
在创建单例模式时,我们一般都需要把构造方法私有化,然后再我们的类中声明一个静态方法,调用这个方法获取实例。
饿汉模式
/**
* 饿汉模式
* @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
来源:oschina
链接:https://my.oschina.net/u/593723/blog/349408