抽象工厂模式

一、
1.抽象工厂(Factory)角色: 抽象工厂模式的核心,包含对多个产品等级结构的声明,任何工厂类都必须实现这个接口。
2.具体工厂(ConcreteFactory)角色: 具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
3.抽象(Product)角色: 抽象模式所创建的所有对象的父类,或声明所有具体产品所共有的公共接口。
4具体产品(ConcreteProduct)角色: 抽象工厂模式所创建的真正实例。
##########################################
二、
1、抽象模式的优点:
抽象工厂模式隔离了具体产品类的生产,使得客户并不需要知道即将创建的对象的具体类型。 比如本例题中,客户端所认识的只有IUSer和IDepartment,至于是SQl server来实现的还是Access来实现的就不知道了。保存了工厂模式的优点。
非常好的实现了 开放-封闭原则 和 依赖倒转 原则
客户端只需要更改工厂的实例化对象时SQl server的或者Access的 。 就可以实现对不同的数据库存的数据进行访问。
增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
2抽象工程的缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。 比如如果此时在增加一个项目表的实现相同的数据库操作功能 就需要增加三个类 并且 还有修改抽象工厂 和 具体的工厂实现类 非常的麻烦。
#################################
三、
例子背景:在一个项目里,既可以用SQL Server 作为数据库,又可以用Access作数据库。写一段数据访问。如增加用户和得到用户的做法。其中可能不止一个表,可能进行多个表的访问。
代码:

####抽象工厂角色

public interface IFactory {
	public IUser createUser();
	public IDeaprtment creatDepartment();
}
1
2
3
4
####具体工厂角色

public class SqlserverFactory implements IFactory{

	@Override
	public IUser createUser() {
		// TODO Auto-generated method stub
		return new SqlServerUser();
	}

	@Override
	public IDeaprtment creatDepartment() {
		// TODO Auto-generated method stub
		return new SqlserverDepartment();
	}

}

public class AccessFactory implements IFactory{

	@Override
	public IUser createUser() {
		// TODO Auto-generated method stub
		return new AccessUser();
	}

	@Override
	public IDeaprtment creatDepartment() {
		// TODO Auto-generated method stub
		return new AccessDepartment();
	}

}

####抽象角色

public interface IUser {
	void Insert(User user);
	User getUser(int id);
}

public interface IDeaprtment {
	void Insert(Department departments);
	Department getDepartments(int id);
}

####具体产品角色

//对用户表进行操作
public class AccessUser implements IUser {

	@Override
	public void Insert(User user) {
		// TODO Auto-generated method stub
		System.out.println("在Access server中给User表增加一条记录");

	}

	@Override
	public User getUser(int id) {
		// TODO Auto-generated method stub
		System.out.println("在Access server中根据ID得到user表的一条记录");
		return null;
	}
}


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

//对部门表进行操作
public class AccessDepartment implements IDeaprtment {

	@Override
	public void Insert(Department departments) {
		// TODO Auto-generated method stub
		System.out.println("在Access server中给Department表增加一条记录");

	}

	@Override
	public Department getDepartments(int id) {
		// TODO Auto-generated method stub
		System.out.println("在Access server中根据ID得到Department表的一条记录");

		return null;
	}

}


public class SqlserverDepartment implements IDeaprtment {

	@Override
	public void Insert(Department departments) {
		// TODO Auto-generated method stub
		System.out.println("在SQL server中给Department表增加一条记录");
	}

	@Override
	public Department getDepartments(int id) {
		// TODO Auto-generated method stub
		System.out.println("在SQL server中根据id得到Department表的一条记录");
		return null ;
	}

}

//###客户端

public class Program {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		User user = new User();
		Department dept = new Department();
		IFactory factory = new SqlserverFactory();//确定实例化哪一个数据库对象给factory
		//		IFactory factory = new AccessFactory();
		IUser iu = factory.createUser();//此时是Sqlserver中的user表。并且已与具体的数据库访问接触了依赖
		iu.Insert(user);
		iu.getUser(1);
		IDeaprtment id = factory.creatDepartment();
		Department departments = null;
		id.Insert(departments);
		id.getDepartments(1);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值