DateFormat是java设计模式简单工厂模式的一个典型例子
如下面代码
DateFormat是抽象类,刚看这些方法可能会很困惑,抽象类不能有自己的实例,但这三个方法貌似违反这一规定
其实不然,这三个方法都是静态的,而不是普通方法
getDateInstance()方法做了一些有趣的事情,一是运用多态性;二是使用静态工厂方法
一、仔细阅读getDateInstance()方法源码可以发现该方法返回的是其子类SimpleDateFormat的一个实例,这是纯正的多态性原则的运用
二、getDateFormat()方法是静态方法。如果是非静态的会怎样?如果是非静态方法,客户端必须取得该类的子类或者实例。而这个类是抽象的,不可能有自己的实例,所以客户端需要获取该类的子类的实例,如果客户端获取子类的实例了,那么还需要这个工厂方法干什么?
使用静态方法是为了把子类实例化的工作隐藏起来,从而客户端不需要关心子类是怎么实例化的,因为DateFormat会提供它合适的子类的实例
如下面代码
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale aLocale);
DateFormat是抽象类,刚看这些方法可能会很困惑,抽象类不能有自己的实例,但这三个方法貌似违反这一规定
其实不然,这三个方法都是静态的,而不是普通方法
getDateInstance()方法做了一些有趣的事情,一是运用多态性;二是使用静态工厂方法
一、仔细阅读getDateInstance()方法源码可以发现该方法返回的是其子类SimpleDateFormat的一个实例,这是纯正的多态性原则的运用
二、getDateFormat()方法是静态方法。如果是非静态的会怎样?如果是非静态方法,客户端必须取得该类的子类或者实例。而这个类是抽象的,不可能有自己的实例,所以客户端需要获取该类的子类的实例,如果客户端获取子类的实例了,那么还需要这个工厂方法干什么?
使用静态方法是为了把子类实例化的工作隐藏起来,从而客户端不需要关心子类是怎么实例化的,因为DateFormat会提供它合适的子类的实例