【设计模式】设计模式漫谈之模板方法模式和单例模式实现的三种方法

一、模板方法模式(Template Method)


【模板方法】定义在一个操作中的一个算法框架,把一些步骤推迟到子类去实现。模板方法模式让子类不需要改变算法结构而重新定义特定的算法步骤。

父类可以把不允许改变的方法设置为final 或者 private。

【回调】表示一段可执行逻辑的引用,我们把该引用传递到另外一段逻辑里,供这段逻辑适时调用。

DRY:Don't Repeat Yourself

OAOO:Once And Only Once


二、单例模式(Singleton)

【单例模式】

1.普通方法(线程安全)

类的构造方法为private;获取类实例的方法为public static 

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

使用:Singleton singleton = Singleton.getInstance();

JVM加载类时,对于static属性的初始化只能由一个线程执行且仅一次

2.延迟创建:把单例的实例化过程移到getInstance

public class ThreadSafeSingleton{
public static synchronized ThreadSafeSingleton getInstance(){
if(instance == null){
instance = new ThreadSafeSingleton();
}
return instance;
}
}

为了线程安全,需要加上synchronized。

3.Double-Check locking

public class DoubleCheckSingleton{
private volatile static DoubleCheckSingleton instance = null;
public static DoubleCheckSingleton getInstance(){
if(instance == null){
synchronized(DoubleCheckSingleton.class){
if(instance == null)
instance = new DoubleCheckSingleton();
}
}
return instance;
}
}

 这里instance是用volatile修饰,因为volatile具有synchronized的可见性,即线程能够自动发现volatile变量的最新值。这样,如果instance实例化成功,其他线程便能发现。

4.Initialization on demand holder模式:线程安全的延迟加载方法

public class LazyLoadedSingleton{
private LazyLoadedSingleton(){}
public static class LazyHolder(){
public static final LazyLoadedSingleton singletonInstance = new LazyLoadedSingleton();
}
public static LazyLoadedSingleton getInstance(){
return LazyHolder.singletonInstance;
}
}

只有第一次调用getInstance方法的时候,JVM才会加载LazyHolder类,然后初始化static属性的singletonInstance这个变量。

此条目发表在设计模式分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注