1.工厂模式在 JDK-Calendar 应用的源码分析
1) JDK 中的 Calendar 类中, 就使用了简单工厂模式
package demo.factory.JDKSRC;
import java.util.Calendar;
public class CalenderDemo {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
}
}
/**
* Gets a calendar using the default time zone and locale. The
* <code>Calendar</code> returned is based on the current time
* in the default time zone with the default
* {@link Locale.Category#FORMAT FORMAT} locale.
*
* @return a Calendar.
*/
public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}
/**
* Gets a calendar with the specified time zone and locale.
* The <code>Calendar</code> returned is based on the current time
* in the given time zone with the given locale.
*
* @param zone the time zone to use
* @param aLocale the locale for the week data
* @return a 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;
}
}
}
2.工厂模式小结
1) 工厂模式的意义
将实例化对象的代码提取出来, 放到一个类中统一管理和维护, 达到和主项目的依赖关系的解耦。 从而提高项
目的扩展和维护性。
2) 三种工厂模式 (简单工厂模式、 工厂方法模式、 抽象工厂模式)
3) 设计模式的依赖抽象原则
创建对象实例时, 不要直接 new 类, 而是把这个 new 类的动作放在一个工厂的方法中, 并返回。 有的书上说,
变量不要直接持有具体类的引用。
不要让类继承具体类, 而是继承抽象类或者是实现 interface(接口)
不要覆盖基类中已经实现的方法