例:最基本的数据访问程序
class User{
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
}
class SqlserverUser{
public void Insert(User user) {
System.out.println("在SQL Server中给User表添加一条记录");
}
public User getUser(int id) {
System.out.println("在SQL Server中根据ID得到User表的一条记录");
return null;
}
}
public class Main{
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
User user=new User();
SqlserverUser su=new SqlserverUser();
su.Insert(user);
su.getUser(1);
}
}
SqlserverUser su=new SqlserverUser()使得su这个对象被框在SQL Server上,不能换数据库,可以用工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。
用工厂方法模式改进:
class User{
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
}
interface IUser{
void Insert(User user);
User getUser(int id);
}
class SqlserverUser implements IUser{
@Override
public void Insert(User user) {
// TODO Auto-generated method stub
System.out.println("在SQL Server中给User表添加一条记录");
}
@Override
public User getUser(int id) {
// TODO Auto-generated method stub
System.out.println("在SQL Server中根据ID得到User表的一条记录");
return null;
}
}
class AccessUser implements IUser{
@Override
public void Insert(User user) {
// TODO Auto-generated method stub
System.out.println("在Access中给User表添加一条记录");
}
@Override
public User getUser(int id) {
// TODO Auto-generated method stub
System.out.println("在Access中根据ID得到User表的一条记录");
return null;
}
}
interface IFactory{
IUser CreateUser();
}
class SqlserverFactory implements IFactory{
@Override
public IUser CreateUser() {
// TODO Auto-generated method stub
return new SqlserverUser();
}
}
class AccessFactory implements IFactory{
@Override
public IUser CreateUser() {
// TODO Auto-generated method stub
return new AccessUser();
}
}
public class Main{
public static void main(String[] args) {
User user=new User();
SqlserverUser su=new SqlserverUser();
su.Insert(user);
su.getUser(1);
}
}
抽象工厂模式改进,增加了关于部门表的处理。
class User{
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
}
interface IUser{
void Insert(User user);
User getUser(int id);
}
class SqlserverUser implements IUser{
@Override
public void Insert(User user) {
// TODO Auto-generated method stub
System.out.println("在SQL Server中给User表添加一条记录");
}
@Override
public User getUser(int id) {
// TODO Auto-generated method stub
System.out.println("在SQL Server中根据ID得到User表的一条记录");
return null;
}
}
class AccessUser implements IUser{
@Override
public void Insert(User user) {
// TODO Auto-generated method stub
System.out.println("在Access中给User表添加一条记录");
}
@Override
public User getUser(int id) {
// TODO Auto-generated method stub
System.out.println("在Access中根据ID得到User表的一条记录");
return null;
}
}
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;
}
}
interface IDepartment{
void Insert(Department department);
Department getDepartment(int id);
}
class SqlserverDepartment implements IDepartment{
@Override
public void Insert(Department department) {
// TODO Auto-generated method stub
System.out.println("在Sqlserver表中给Department表增加一条记录");
}
@Override
public Department getDepartment(int id) {
// TODO Auto-generated method stub
System.out.println("在Sqlserver表中根据ID得到Department表一条记录");
return null;
}
}
class AccessDepartment implements IDepartment{
@Override
public void Insert(Department department) {
// TODO Auto-generated method stub
System.out.println("在Access表中给Department表增加一条记录");
}
@Override
public Department getDepartment(int id) {
// TODO Auto-generated method stub
System.out.println("在Access表中根据ID得到Department表一条记录");
return null;
}
}
interface IFactory{
IUser CreateUser();
IDepartment CreateDepartment();
}
class SqlserverFactory implements IFactory{
@Override
public IUser CreateUser() {
// TODO Auto-generated method stub
return new SqlserverUser();
}
@Override
public IDepartment CreateDepartment() {
// TODO Auto-generated method stub
return new SqlserverDepartment();
}
}
class AccessFactory implements IFactory{
@Override
public IUser CreateUser() {
// TODO Auto-generated method stub
return new AccessUser();
}
@Override
public IDepartment CreateDepartment() {
// TODO Auto-generated method stub
return new AccessDepartment();
}
}
public class Main{
public static void main(String[] args) {
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);
}
}
用简单工厂来改进抽象工厂:去除IFactory、SqlserverFactory、AccessFactory三个工厂类,用DataAccess类代替,用一个简单工厂模式来实现。
class User {
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
}
interface IUser {
void Insert(User user);
User getUser(int id);
}
class SqlserverUser implements IUser {
@Override
public void Insert(User user) {
// TODO Auto-generated method stub
System.out.println("在SQL Server中给User表添加一条记录");
}
@Override
public User getUser(int id) {
// TODO Auto-generated method stub
System.out.println("在SQL Server中根据ID得到User表的一条记录");
return null;
}
}
class AccessUser implements IUser {
@Override
public void Insert(User user) {
// TODO Auto-generated method stub
System.out.println("在Access中给User表添加一条记录");
}
@Override
public User getUser(int id) {
// TODO Auto-generated method stub
System.out.println("在Access中根据ID得到User表的一条记录");
return null;
}
}
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;
}
}
interface IDepartment {
void Insert(Department department);
Department getDepartment(int id);
}
class SqlserverDepartment implements IDepartment {
@Override
public void Insert(Department department) {
// TODO Auto-generated method stub
System.out.println("在Sqlserver表中给Department表增加一条记录");
}
@Override
public Department getDepartment(int id) {
// TODO Auto-generated method stub
System.out.println("在Sqlserver表中根据ID得到Department表一条记录");
return null;
}
}
class AccessDepartment implements IDepartment {
@Override
public void Insert(Department department) {
// TODO Auto-generated method stub
System.out.println("在Access表中给Department表增加一条记录");
}
@Override
public Department getDepartment(int id) {
// TODO Auto-generated method stub
System.out.println("在Access表中根据ID得到Department表一条记录");
return null;
}
}
class DataAccess{
private static String db="Sqlserver";
//private static String db="Access";
public static IUser CreateUser() {
IUser result=null;
switch(db) {
case "Sqlserver":
result=new SqlserverUser();break;
case "AccessUser":
result=new AccessUser();break;
}
return result;
}
public static IDepartment CreateDepartment() {
IDepartment result=null;
switch(db) {
case "Sqlserver":
result=new SqlserverDepartment();break;
case "AccessUser":
result=new AccessDepartment();break;
}
return result;
}
}
public class Main{
public static void main(String[] args) {
User user=new User();
Department dept=new Department();
IUser iu=DataAccess.CreateUser();
iu.Insert(user);
iu.getUser(1);
IDepartment id=DataAccess.CreateDepartment();
id.Insert(dept);
id.getDepartment(1);
}
}