Java设计模式讲解(一)
1、观察者/发布/订阅模式
此模式用于对象之间有一对多的依赖。
定时:定义了对象之间一对多的依赖,这样一来,当一个状态改变的时候,它的所有依赖者都会通知并自动更新。(当一个状态发生改变时,其他的依赖者都会收到通知)。比如像当当网、京东商城一类的电子商务网站,如果你对某件商品比较关注,可以放到收藏架,那么当该商品降价时,系统给您发送手机短信或邮件。这就是观察者模式的一个典型应用,商品是被观察者,有的叫主体;关注该商品的客户就是观察者。
目的:将主题和观察者分开,为了交互对象之间松耦合。使系统变的有弹性。
2、策略模式
场景:此用于对象固定,而对象的行为n的时候情况(鸭子固定,改变的是鸭子的行为)定义:定义了算法族,将他们分别封装起来,让他们之间可以相互的替换,此模式让算法的变化独立于使用算法的客户。理解:将算法/行为和客户/对象采用组合的方式进行。
例子:将鸭子定义为一个类(Duck),鸭子的行为(Behavior)定义一个类,这样鸭子的行为不是继承而来,而是和适当的行为组合(composition)而来的。
3、单例模式的几种实现
懒汉模式
优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁synchronized 才能保证单例,(如果两个线程同时调用getInstance方法,会chuxia)但加锁会影响效率。
public class Singleton {
//注意 分布式系统中慎用 多线程同步 构造函数私有化
private static volatile Singleton st;
private Singleton (){}
public static Singleton getInstance() {
if (null == st) {
synchronized (Singleton.class) {
if (st == null) {
st = new Singleton();
return st;
}
}
}
return st;
}
}
2.饿汉式单例
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存
public class Singleton {
private static final Singleton SINGLETON = new Singleton();
private Singleton() {} //此类不能被实例化
public static synchronized Singleton getInstance() {
return SINGLETON;
}
3.登记式模式(holder)
内部类只有点,是最好的单例模式。
public class Singleton {
private Singleton() {} //构造方法是私有的,从而避免外界利用构造方法直接创建任意多实例。
public static Singleton getInstance() {
return Holder.SINGLETON;
}
//使用内部类嵌套类的对象,并不需要其外围类的对象。 即它可以不依赖于外部类实例被实例化。
private static class Holder {
private static final Singleton SINGLETON = new Singleton();
}