抽象工厂模式

相对于开始讲的简单工厂模式和工厂方法模式,抽象工厂模式则是进一步抽象我觉得。

比如在之前的需求上,进一步增加需求,整个需求在原需求的范围之外。

很平常的一个例子就是更换数据库,你的dao层代码可能会要大改,因为

大部分数据库语言会有差异。

当然这里插入一点,如果使用框架的话,可能改动的较少,比如hibernate,他都帮你封装好了,

其实也改了,只是是hibernate帮你改好了,你不用改而已。

今天的代码需求是基于一个换数据库的角度,如果要同时支持两个数据库sqlserver以及access,

则应该由哪种数据模式实现。

下面看类图吧:



和之前简单工厂和工厂方法的类图可以比较出,开始的简单工厂模式,仅仅是把Factory类抽象一层,以增加可以生成不同的工厂。

而工厂方法则是把左边某一个也抽象出来,与工厂关联起来。

但是抽象工厂,则是左边有两个不同的接口规范,并且对应着右边的工厂类。

下面看具体类:

UserService类:

package com.blog.anla.AbstractFactory;
/**
 * 用户表接口
 * @author U-ANLA
 *
 */
public interface UserService {
	public void insert(User user);
}


AccessUser类:

package com.blog.anla.AbstractFactory;

public class AccessUser implements UserService{
	@Override
	public void insert(User user) {
		System.out.println("在access中插入user表");
	}

}


SqlserverUser类:

package com.blog.anla.AbstractFactory;

public class SqlserverUser implements UserService{

	@Override
	public void insert(User user) {
		System.out.println("在sqlserver中 插入user表");
	}

}


DepartmentService类:

package com.blog.anla.AbstractFactory;
/**
 * 部门表接口
 * @author U-ANLA
 *
 */
public interface DepartmentService {
	public void insert(Department department);
}


AccessDepartment类:

package com.blog.anla.AbstractFactory;

public class AccessDepartment implements DepartmentService{

	@Override
	public void insert(Department department) {
		System.out.println("在 access中插入department!");		
	}

}


SqlserverDepartment类:

package com.blog.anla.AbstractFactory;

public class SqlserverDepartment implements DepartmentService{

	@Override
	public void insert(Department department) {
		System.out.println("在 sqlserver中插入department!");
	}

}


Factory类:

package com.blog.anla.AbstractFactory;
/**
 * 工厂接口
 * @author U-ANLA
 *
 */
public interface Factory {
	public UserService createUser();
	public DepartmentService createDepartment();
}


AccessFactory类:

package com.blog.anla.AbstractFactory;
/**
 * access工厂
 * @author U-ANLA
 *
 */
public class AccessFactory implements Factory{

	@Override
	public UserService createUser() {
		return new AccessUser();
	}

	@Override
	public DepartmentService createDepartment() {
		return new AccessDepartment();
	}
	
}


SqlserverFactory类:

package com.blog.anla.AbstractFactory;
/**
 * sqlserver工厂
 * @author U-ANLA
 *
 */
public class SqlserverFactory implements Factory{

	@Override
	public UserService createUser() {
		return new SqlserverUser();
	}

	@Override
	public DepartmentService createDepartment() {
		return new SqlserverDepartment();
	}

}


代码类有点多,看类图理解直接些哈。

赠人玫瑰手留余香(oo)







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值