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) ;
}
}
抽象工厂模式
提供一个创建一系列相关或者相互依赖的接口,而无需指定他们具体的类。