工厂模式(二)

来源:互联网 发布:数据库三张表关联查询 编辑:程序博客网 时间:2024/05/18 02:53

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

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

 

原创粉丝点击