提供一个创建对象实例的功能,而无需关心具体实现。被创建实例的类型可以是接口、抽象类、也可以是具体的类。
二、简单工厂类图
三、简单工厂时序图
四、简单工厂的优点
1、帮助封装
2、解耦
五、简单工厂的缺点
1、可能增加客户端的复杂度
2、不方便扩展子工厂
六、具体代码实现
1、Api接口
package com.simplefactory.api; /** * 接口的定义,该接口可以通过简单工厂来创建 * @author wmli * Create on 2011-4-23 */ public interface Api { /** * 示意,具体功能方法的定义 * @param s 示意,需要的参数 */ public void operation(String s); }
2、三个具体实现
package com.simplefactory.api.impl; import com.simplefactory.api.Api; /** * 接口具体实现对象A * @author wmli * Create on 2011-4-23 */ public class ApiImplA implements Api { @Override public void operation(String s) { System.out.println("ApiImplA s = " + s); } }
package com.simplefactory.api.impl; import com.simplefactory.api.Api; /** * 接口的具体实现对象B * @author wmli * Create on 2011-4-23 */ public class ApiImplB implements Api { @Override public void operation(String s) { System.out.println("ApiImplB s = " + s); } }
package com.simplefactory.api.impl; import com.simplefactory.api.Api; /** * 接口的具体实现对象C * @author wmli * Create on 2011-4-23 */ public class ApiImplC implements Api { @Override public void operation(String s) { System.out.println("ApiImplC s = " + s); } }
3、工厂类
package com.simplefactory.factory; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import com.simplefactory.api.Api; import com.simplefactory.api.impl.ApiImplA; import com.simplefactory.api.impl.ApiImplB; /** * 工厂类,用来创建Api对象 * @author wmli * Create on 2011-4-23 */ public class ApiFactory { /** * 具体创建Api对象的方法 * @param condition 示意,从外部传入的择条件 * @return 创建好的Api对象 */ public static Api createApi(int condition) { Api api = null; if (condition == 1) { api = new ApiImplA(); } else if (condition == 2) { api = new ApiImplB(); } return api; } /** * 根据配置文件创建Api对象 * 配置文件为 ipmlClass =com.simplefactory.api.impl.ApiImplC * @return 创建好的Api对象 */ public static Api createApiByConfig() { Properties properties = new Properties(); InputStream in = null; try { String filePath = ApiFactory.class.getResource("/").getPath(); in = new BufferedInputStream(new FileInputStream(new File(filePath + "factory.properties"))); properties.load(in); } catch (IOException e) { e.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } Api api = null; try { api = (Api)Class.forName(properties.getProperty("ipmlClass")).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return api; } }
4、客户端
package com.simplefactory.client; import com.simplefactory.api.Api; import com.simplefactory.factory.ApiFactory; /** * 客户端使用Api接口 * @author wmli * Create on 2011-4-23 */ public class Client { public static void main(String[] args) { //根据条件择不同的实现类 Api api = ApiFactory.createApi(1); api.operation("正在使用简单工厂"); //根据配置文件择实现类 Api cApi = ApiFactory.createApiByConfig(); cApi.operation("正在使用可配置的简单工厂"); } }