其实,工厂模式的应用很广泛,在我们使用的常用的类和方法里,也有工厂模式的影子。我们来学习以下这些例子
一.java.util.Calendar
在调用Calender的getInstance方法时,这个方法会根据传入信息返回合适的Calender子类对象。
这里抽象产品是Calendar,具体产品有:BuddhistCalendar, JapaneseImperialCalendar, GregorianCalendar
而工厂也是Calendar,这个工厂类提供了静态的getInstance方法返回各种具体产品
如果增加一种新的Calendar,那么只用修改getInstance方法,而Calendar的使用者不需要因为这种变化而修改代码。
java.util.Calendar这部分的代码逻辑如下:
public static Calendar getInstance()
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());
cal.sharedZone = true;
return cal;
}
public static Calendar getInstance(TimeZone zone)
{
return createCalendar(zone, Locale.getDefault());
}
public static Calendar getInstance(Locale aLocale)
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(), aLocale);
cal.sharedZone = true;
return cal;
}
public static Calendar getInstance(TimeZone zone,
Locale aLocale)
{
return createCalendar(zone, aLocale);
}
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);
}
二.Spring中的工厂模式
Sping实现中应用到了工厂模式,我们可以把Spring容器堪称一个功能超强的工厂。外界使用配置文件来配置Bean,在你需要实例化一个Bean的时候(通常是单例的),Sping工厂就会去读取相应的配置文件,生成和管理这些实例。
Spring工厂不仅提供对产品的生成,还提供了产品的管理,包含对产品生命周期的管理,还有产品之间依赖关系的管理。
例如:
<beans>
<!-- 定义第一个balala,该bean的id为balala->
<bean id="chinese" class="xxx.Balala"/>
<!-- 定义第二个apple,该bean的id为apple-->
<bean id="american" class="xxx.Apple"/>
</beans>
在XML文件中可以做这样的配置,那么在外面就可以直接使用id获取相应的实例(产品)了