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的一系列应用体现了哪种设计模式?