设计模式-单例模式与观察者模式

132 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情 >>

单例模式

简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()方法来获取它们的实例;

1.构造方法私有化;2.实例化的变量引用私有化;3.获取实例的方法公有

getInstance()的返回值是一个对象的引用,并不是一个新的实例,所以不要错误的理解成多个对象。

单例模式的实现:

public class Singleton {
	private static Singleton singleton;
    
    private Singleton() {
    }
    public static Singleton getInstance(){
    	if(singleton == null){
        	singleton = new Singleton();
        }
        return singleton;
    }
}

这是最基本的写法,也叫懒汉式写法(线程不安全),下面再介绍几种单例模式的实现方法:

懒汉式写法(线程安全)

public class Singleton {
	private static Singleton instance;

	private Singleton() {
	}
	public static synchronized Singleton getInstance() {
		if (instance == null) {
			instance = new Singleton();
		}
		return instance;
	}
}

饿汉式写法

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

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

静态内部类

public class Singleton {
	private static class SingletonHolder {
    	private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton() {
    }
    public static final Singleton getInstance() {
    	return SingletonHolder.INSTANCE;
    }
}

枚举

public enum Singleton {
    INSTANCE;
    public Singleton getInstance(){
        return INSTANCE;
    }
}

这种方式是《Effective Java》作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,

单元素的枚举类型已经成为实现Singleton的最佳方法。

双重校验锁

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

\

观察者模式

在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。

其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

observer

  • 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
  • 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  • 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
  • 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

小结:

  • 这个模式是松偶合的。改变主题或观察者中的一方,另一方不会受到影像。
  • JDK中也有自带的观察者模式。但是被观察者是一个类而不是接口,限制了它的复用能力。
  • 在JavaBean和Swing中也可以看到观察者模式的影子。