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