1、概述
抽象工厂模式为一个产品家族提供了统一的创建接口。当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对应的系列来创建一个具体的工厂类别。
2、抽象工厂模式中的角色
- 抽象工厂(AbstractFactory):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
- 具体工厂(ConcreteFactory):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
- 抽象产品(AbstractProduct):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
- 具体产品(ConcreteProduct):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
3、结构图
4、代码实现
产品类:
///抽象产品
public interface IUser{
User getUser();
bool saveUser();
}
//抽象产品
public interface IEmployee{
Employee getEmployee();
bool saveEmployee();
}
// 与MySql相关的具体产品User
public class SqlUser implements IUser {
public User getUser(){
return null;
}
public bool saveUser(){
return false;
}
}
//与mysql相关的具体产品Employee
public class SqlEmployee implements IEmployee{
public Employee getEmployee(){
return null;
}
public bool saveEmployee(){
return false;
}
}
// 与Access相关的具体产品User
public class AccessUser implements IUser{
public User GetUser(){
return null;
}
public bool SaveUser(){
return false;
}
}
// 与Access相关的具体产品Employee
public class AccessEmployee implements IEmployee{
public Employee getEmployee(){
return null;
}
public bool saveEmployee(){
return false;
}
}
工厂类:用于创建不同类型的产品,抽象工厂可以是接口,也可以是抽象类。
// 抽象工厂类
public interface IDatabaseFactory{
IEmployee createEmployee();
IUser createUser();
}
//mysql相关产品的实现
public class MySqlDatabaseFactory implements IDatabaseFactory {
public IEmployee createEmployee(){
return new SqlEmployee();
}
public IUser createUser(){
return new SqlUser();
}
}
// 与Access相关产品的实现
public class AccessDatabaseFactory implements IDatabaseFactory {
public IEmployee createEmployee(){
return new AccessEmployee();
}
public IUser createUser(){
return new AccessUser();
}
}
具体调用:
IDatabaseFactory factory = new MySqlDatabaseFactory();
IUser user = factory.createUser();
IEmployee employee = factory.createEmployee();
5、使用场景
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时。