vlambda博客
学习文章列表

JDK中应用单例模式、简单工厂模式的示例

1

单例模式在Runtime类中的体现

Runtime类是java lang包的一个类,该类封装了Java运行时的环境。每个Java应用程序都有一个运行时实例,应用程序不能创建自己的 Runtime 类实例,但可以通过 getRuntime 方法获取当前Runtime运行时对象的引用。

该类的部分源码如下:

public class Runtime {

private static Runtime currentRuntime = new Runtime();


    /**

     * Returns the runtime object associated with the current Java application.

     * Most of the methods of class <code>Runtime</code> are instance

     * methods and must be invoked with respect to the current runtime object.

     *

     * @return  the <code>Runtime</code> object associated with the current

     *          Java application.

     */

  public static Runtime getRuntime() {

        return currentRuntime;

    }


    /** Don't let anyone else instantiate this class */

private Runtime() {}

}

很明显这是饿汉式单例模式的一个应用。

2

简单工厂模式在Calendar类中的体现

Calendar类是Java中用于处理日期和时间的抽象类,不能实例化,但是可以通过其静态工厂方法getInstance()获得Calendar实例。

部分源代码如下:

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;

    }

从代码可以看出,它可以根据不同的地区来创建不同的日历对象,就好比日历这个工厂,生产着世界上各地区的日历,用户需要某个地区的日历,只需要传参数告诉工厂即可,不需要知道日历制作过程和实例的过程。很显然,这是简单工厂模式的一种体现。

如输出当前的时间可以这样写代码:

Calendar mycalendar=Calendar.getInstance(Locale.CHINA);

System.out.println(mycalendar.getTime()); 

3

自我扩充学习

问题1:

如何在自己的电脑上查看JDK中的java源码?

问题2:

下图是Iterator的应用示意图,体现了哪种设计模式?Iterator源代码如何体现这种模式的?

问题3:

JDBC的一系列应用体现了哪种设计模式?