首页 > 其他 > 详细

抽象工厂模式

时间:2014-07-26 15:10:00      阅读:334      评论:0      收藏:0      [点我收藏+]
抽象工厂(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。一般用反射,配置文件等方式实现。
1、易于交换产品系列。由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
2、它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
如果需求来自增加功能,此时,需要增加若干类,并修改相关的工厂类。
package gof23;

public class AbstractFactoryTest {
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		//操作SqlServer数据库
		DataAccess.setFullyQualifiedName("gof23.Sqlserver");
		IUser user = DataAccess.createUser();
		user.insert(null);
		user.getUser(0);
		IDepartment dept = DataAccess.createDepartment();
		dept.insert(null);
		dept.getDept(0);
		System.out.println("\n"+"---------------我是华丽的分割线------------------"+"\n");
		//操作Mysql数据库
		DataAccess.setFullyQualifiedName("gof23.Mysql");
		user = DataAccess.createUser();
		user.insert(null);
		user.getUser(0);
		dept = DataAccess.createDepartment();
		dept.insert(null);
		dept.getDept(0);
	}
}

/*
 * 用户表的字段
 */
class User {
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

/*
 * 部门表的字段
 */
class Department {
	private int id;
	private String deptName;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getDeptName() {
		return deptName;
	}
	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}
}

/*
 * 利用反射技术,去除switch或if,解除分支判断带来的耦合
 */
class DataAccess {
	private static String FullyQualifiedName;
	
	public static String getFullyQualifiedName() {
		return FullyQualifiedName;
	}

	public static void setFullyQualifiedName(String fullyQualifiedName) {
		FullyQualifiedName = fullyQualifiedName;
	}

	public static IUser createUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		String name = FullyQualifiedName + "User";
		return (IUser) Class.forName(name).newInstance();
	}
	
	public static IDepartment createDepartment() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		String name = FullyQualifiedName + "Department";
		return (IDepartment) Class.forName(name).newInstance();
	}
}

/*
 * 用户表的接口
 */
interface IUser{
	public void insert(User user);
	public User getUser(int id);
}

/*
 * Sqlserver用户表的实现
 */
class SqlserverUser implements IUser {

	@Override
	public void insert(User user) {
		System.out.println("在SQL server中给User表增加一条记录");
	}

	@Override
	public User getUser(int id) {
		System.out.println("在SQL server中根据ID得到User表一条记录");
		return null;
	}
	
}

/*
 * Mysql用户表的实现
 */
class MysqlUser implements IUser {

	@Override
	public void insert(User user) {
		System.out.println("在Mysql中给User表增加一条记录");
	}

	@Override
	public User getUser(int id) {
		System.out.println("在Mysql中根据ID得到User表一条记录");
		return null;
	}
	
}

/*
 * 部门表的接口
 */
interface IDepartment {
	public void insert(Department dep);
	public Department getDept(int id);
}

/*
 * Sqlserver部门表的实现
 */
class SqlserverDepartment implements IDepartment {

	@Override
	public void insert(Department dep) {
		System.out.println("在SQL server中给Department表增加一条记录");
	}

	@Override
	public Department getDept(int id) {
		System.out.println("在SQL server中根据ID得到Department表一条记录");
		return null;
	}
	
}

/*
 * Mysql部门表的实现
 */
class MysqlDepartment implements IDepartment {

	@Override
	public void insert(Department dep) {
		System.out.println("在Mysql中给Department表增加一条记录");
	}

	@Override
	public Department getDept(int id) {
		System.out.println("在Mysql中根据ID得到Department表一条记录");
		return null;
	}
	
}

运行结果为:
在SQL server中给User表增加一条记录
在SQL server中根据ID得到User表一条记录
在SQL server中给Department表增加一条记录
在SQL server中根据ID得到Department表一条记录

---------------我是华丽的分割线------------------

在Mysql中给User表增加一条记录
在Mysql中根据ID得到User表一条记录
在Mysql中给Department表增加一条记录
在Mysql中根据ID得到Department表一条记录


抽象工厂模式,布布扣,bubuko.com

抽象工厂模式

原文:http://blog.csdn.net/hjiam2/article/details/38142691

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!