工厂模式(二)

其实,工厂模式的应用很广泛,在我们使用的常用的类和方法里,也有工厂模式的影子。我们来学习以下这些例子

一.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获取相应的实例(产品)了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值