设计模式(六)——抽象工厂模式

例:最基本的数据访问程序

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);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值