从最初代码到抽象工厂模式(以USER访问数据库数据为例)

1.最初代码

用户类(假设只有ID和Name两个字段)
public class User {

private int _id;
private String _name;
public int get_id() {
	return _id;
}
public void set_id(int _id) {
	this._id = _id;
}
public String get_name() {
	return _name;
}
public void set_name(String _name) {
	this._name = _name;
}

}
SqlserverUser类(用于操作User表,假设只有新增用户和得到用户方法)
public class SqlSserverUser {

public void Inset(User usser) {
//......在SQL Server中给User表增加一条记录
}
public User GetUser(int id) {
	//在SQL Server中根据ID得到User表中一条记录
	return null;
}

}
客户端代码
public class Main {

public static void main(String[] args) {
	// TODO 自动生成的方法存根

	User user=new User();
	SqlserverUser su=new SqlserverUser();//与SQL server 耦合
	
	su.Inset(user );
	
	su.GetUser(1);
	
}

}
缺点:不能更换数据库,原因在于 SqlserverUser su=new SqlserverUser();使得us这个对象被框死在SQL server上了。

2.用工厂方法模式的数据访问程序

uml类图
在这里插入图片描述
IUser接口
public interface IUser {

void Inset(User user) ;
User GetUser(int id);

}
SqlserverUser类(用于访问SQl server的 User)
(同上)
public class SqlserverUser implements IUser{

public void Inset(User usser) {
//......在SQL Server中给User表增加一条记录
}
public User GetUser(int id) {
	//在SQL Server中根据ID得到User表中一条记录
	return null;
}

}
AccessUser类
public class AccessUser implements IUser{

public void Inset(User usser) {
//......在Access中给User表增加一条记录
}
public User GetUser(int id) {
	//在Access中根据ID得到User表中一条记录
	return null;
}

}
IFactory接口(定义一个创建访问User表对象的抽象的工厂接口)
public interface IFactory {

IUser CreateUser();

}

SqlServerFactory类,实现IFactory接口,实例化SqlserverUser
public class SqlServerFactory implements IFactory{

@Override
public IUser CreateUser() {
	// TODO 自动生成的方法存根
	return new SqlserverUser();
}

}
AccessUser类
public class Access implements IFactory{

@Override
public IUser CreateUser() {
	// TODO 自动生成的方法存根
	return new AcccessUser();
}

}
客户端代码
public class Main {

public static void main(String[] args) {
	// TODO 自动生成的方法存根

	User user=new User();
	
	IFactory factory=new SqlServerFactory();
	
	IUser iu=factory.CreateUser();
	
	iu.Inset(user);
	iu.GetUser(1);
	
}

}
更换数据库时只需把IFactory factory=new SqlServerFactory();改成IFactory factory=new AccessFactory();即可。
但若要增加一个部门表,需要增加好多类。

3.用了抽象工厂模式的数据访问程序

代码结构图
在这里插入图片描述

IDepartment接口,用于客户端访问,解除与具体数据库访问的耦合。
interface IDepar tment
{
void Insert (Department department) ;
Depar tment GetDepartment (int id) ;
}

SqlserverDepartment类,用于访问SQL Server的Department。
class SqlserverDepartment implements IDepartment
public void Insert (Department department) {
Console . WriteLine (“在SQL Server 中给Department表增加一条 记录”);}

public Department GetDepar tment (int id)
Console. WriteLine (“在SQL Server 中根据ID得到Department表一条记录”);
return null;
}
}

AccessDepartment类,用于访问Access的Department。
class AccessDepartment implements IDepartment
public void Insert (Department department)
{
Console . WriteLine (“在Access中给Department表增加一条记录”) ;
}
public Department GetDepartment (int id){
Console . WriteLine ("在Access中根据ID得到Department表一条 记录
return null ;
}
}
IFactory接口,定义一个创建访问User表对象的抽象的工厂接口。
interface IFactory
{
IUser CreateUser () ;
IDepar tment Crea teDepartment () ; //增加的接口方法
}
SqlServerFactory类,实现IFactory接口,实例化SqlServerUser和SqlServerDepartment。
class SqlServerFactory implements IFactory {
public IUser CreateUser() {
return new SqlserverUser();
}

public IDepartment CreateDepartment() {
	return new SqlserverDepartment();
}

}
AccessFactory类,实现IFactory接口,实例化AccessUser和Accessment。
class AccessFactory implements IFactory {
public IUser CreateUser() {
return new AccessUser();
}

public IDepartment CreateDepartment() {
	return new AccessDepartment();
}

}
客户端

public class Main {

public static void main(String[] args) {
	// TODO 自动生成的方法存根
	User user = new User () ;
	Department dept = new Department() ;
	// IFactory factory = new SqlServerFactory ();
	
	IFactory factory = new AccessFactory() ;
	IUser iu = factory.CreateUser() ;
	iu. Insert (user) ;
	iu. GetUser(1) ;
	IDepartment id = factory . CreateDepartment () ;
	id. Insert (dept) ;
	id. GetDepartment(1) ;

	
}

}
在这里插入图片描述

抽象工厂模式

提供一个创建一系列相关或者相互依赖的接口,而无需指定他们具体的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值