设计模式 - 简单工厂模式

一、简单工厂的定义
提供一个创建对象实例的功能,而无需关心具体实现。被创建实例的类型可以是接口、抽象类、也可以是具体的类。

二、简单工厂类图


三、简单工厂时序图


四、简单工厂的优点
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("正在使用可配置的简单工厂");
	}
}

猜你喜欢

转载自topsale.iteye.com/blog/1014245