设计模式――简单工厂 (二)

2014-11-24 09:53:47 · 作者: · 浏览: 1
na实例 Fruit banana = FruitFactory.getFruit("banana"); //采集 apple.get(); banana.get(); } }
还可以再改进

public class FruitFactory { 
     
    /** 
     * get方法,获得所有产品对象 
     * @throws IllegalAccessException  
     * @throws Exception  
     */ 
    public static Fruit getFruit(String type) throws Exception{ 
        return (Fruit)Class.forName(type).newInstance(); 
    } 
} 

public class MainClass { 
     
    public static void main(String[] args) throws Exception { 
        //得到Apple实例 
        Fruit apple = FruitFactory.getFruit("Apple"); 
        //得到Banana实例 
        Fruit banana = FruitFactory.getFruit("Banana"); 
        //采集 
        apple.get(); 
        banana.get(); 
    }    
}


虽然对上面的有所改进,但还是缺乏灵活性,因为还需要指定类名,可以通过配置文件配置然后读取。

下面我们将.java文件先放到com.meritit包下,并建立一个fruit.properties文件和ConfigUtil.java工具类。


fruit.properties文件内容如下:

apple = com.meritit.Apple
banana = com.meritit.Banana

ConfigUtil是读取配置文件的一个工具类:

package com.meritit; 
 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Properties; 
public class ConfigUtil { 
    /** 
     *  
     * @param key 
     * @return value 
     */ 
    public static String getConfig(String style){ 
        Properties pro = new Properties(); 
        InputStream inStream = ConfigUtil.class.getClassLoader() 
                .getResourceAsStream("fruit.properties"); 
        try { 
            pro.load(inStream); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
        return pro.getProperty(style); 
    } 
} 

现在工厂方法可以写成这样:

package com.meritit; 
 
public class FruitFactory { 
     
    /** 
     * get方法,获得所有产品对象 
     * @throws IllegalAccessException  
     * @throws Exception  
     */ 
    public static Fruit getFruit(String type) throws Exception{ 
        String fruittype = ConfigUtil.getConfig(type); 
        return (Fruit)Class.forName(fruittype).newInstance(); 
    } 
} 

获得实例:

package com.meritit; 
 
public class MainClass { 
     
    public static void main(String[] args) throws Exception { 
        //得到Apple实例 
        Fruit apple = FruitFactory.getFruit("apple"); 
        //得到Banana实例 
        Fruit banana = FruitFactory.getFruit("banana"); 
        //采集 
        apple.get(); 
        banana.get(); 
    }    
} 

在这个模式中,工厂类是整个模式的关键。它包含必要的判断逻辑,能够根据外界给定的信息知道创建那个类的实例,外部无需了解该对象是如何被创建和组织的。有利于软件体系结构化。

但是不难发现,简单工厂模式的缺点也体现在工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中具体产品不断增多时,可能会出现要求工厂类也要做出相应的修改,扩展性并不好。

举一个应用的例子:

源代码下载http://download.csdn.net/detail/lxq_xsyu/5903699