4-2.工厂设计模式

背景:

uml类图如下:

简介

工厂模式的jdk源码分析:

public class Test01 {
    public static void main(String[] args) {
        //Calendar的底层用到了工厂模式
        Calendar calendar=Calendar.getInstance();
        System.out.println("年"+calendar.get(Calendar.YEAR));
    }
}
//2:第二层,发现调用的是createCalendar的方法
public static Calendar getInstance(TimeZone zone,Locale aLocale)
{
        return createCalendar(zone, aLocale);
}

private static Calendar createCalendar(TimeZone zone,Locale aLocale){
    CalendarProvider provider =
        LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
        .getCalendarProvider();
    if (provider != null) {
        try {
            return provider.getInstance(zone, aLocale);
        } catch (IllegalArgumentException iae) {
            // fall back to the default instantiation
        }
    }

        Calendar cal = null;
        //发现这里具有工厂模式的特性,根据传入的不同,创建不同的对象
        if (aLocale.hasExtensions()) {
            String caltype = aLocale.getUnicodeLocaleType("ca");
            if (caltype != null) {
                switch (caltype) {
                case "buddhist":
                cal = new BuddhistCalendar(zone, aLocale);
                    break;
                case "japanese":
                    cal = new JapaneseImperialCalendar(zone, aLocale);
                    break;
                case "gregory":
                    cal = new GregorianCalendar(zone, aLocale);
                    break;
                }
            }
        }
        if (cal == null) {
            // If no known calendar type is explicitly specified,
            // perform the traditional way to create a Calendar:
            // create a BuddhistCalendar for th_TH locale,
            // a JapaneseImperialCalendar for ja_JP_JP locale, or
            // a GregorianCalendar for any other locales.
            // NOTE: The language, country and variant strings are interned.
            if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
                cal = new BuddhistCalendar(zone, aLocale);
            } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
                       && aLocale.getCountry() == "JP") {
                cal = new JapaneseImperialCalendar(zone, aLocale);
            } else {
                cal = new GregorianCalendar(zone, aLocale);
            }
        }
        return cal;

posted @ 2022-07-21 22:24  努力的达子  阅读(19)  评论(0编辑  收藏  举报