平时使用时都是Calendar c = Calendar.getInstance();  
Calendar是一个抽象类,得到的是一个子类GregorianCalendar的对象,
在JAVA中会经常使用父类引用指向子类对象,为了是可以方便的替换成其它子类对象。
但是Calendar只有一个子类GregorianCalendar,为什么也要这么写呢,也不可能替换成其他子类啊?

解决方案 »

  1.   

    工厂模式看下jdk的源码:
    getInstance()方法:public static Calendar getInstance()
        {
            Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
        cal.sharedZone = true;
        return cal;
        }
    那我们再看看createCalendar方法:private static Calendar createCalendar(TimeZone zone,
                           Locale aLocale)
        {
        // If the specified locale is a Thai locale, returns a BuddhistCalendar
        // instance.
        if ("th".equals(aLocale.getLanguage())
            && ("TH".equals(aLocale.getCountry()))) {
            return new sun.util.BuddhistCalendar(zone, aLocale);
        } else if ("JP".equals(aLocale.getVariant())
               && "JP".equals(aLocale.getCountry())
               && "ja".equals(aLocale.getLanguage())) {
            return new JapaneseImperialCalendar(zone, aLocale);
        }            // else create the default calendar
            return new GregorianCalendar(zone, aLocale);    
        }可以看到 在jdk源码实现中 分别针对了泰国和日本产生了不同的日历对象sun.util.BuddhistCalendar 和JapaneseImperialCalendar,以及标准历法的GregorianCalendar。
    BuddhistCalendar也是继承自GregorianCalendar.同样的道理,如果今后有其他的日期计算方法,不同于当前的格林威治时间,Calendar接口仍然可以使用,我们只需要扩展他实现一个类就行了,然后修改下getInstance 这个静态方法的实现就完了。