模式定义
抽象工厂模式(Abstract Factory),提供了一个创建一系列相关或者相依赖对象的接口,而无须制定他们的具体类型。
模式结构
![](https://i-blog.csdnimg.cn/blog_migrate/33fa95743d0f51e8350b46dd1f394085.png)
模式实现
UML图
具体属性类
package com.nchu.abstractFactory;
public class User {
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
package com.nchu.abstractFactory;
public class Department {
private String departmentName;
private int id;
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
AbstractFactory
package com.nchu.abstractFactory;
interface IFactory {
public IUser createUser();
public IDepartment createDepartment();
}
抽象工厂具体实现类
package com.nchu.abstractFactory;
public class SqlServerFactory implements IFactory {
public IUser createUser() {
return new SqlserverUser();
}
public IDepartment createDepartment() {
return new SqlserverDepartment();
}
}
package com.nchu.abstractFactory;
public class AccessFactory implements IFactory {
public IUser createUser() {
return new AccessUser();
}
public IDepartment createDepartment() {
return new AccessDepartment();
}
}
AbstractProduct
package com.nchu.abstractFactory;
interface IDepartment {
public void insert(Department department);
public Department getDepartment(int id);
}
package com.nchu.abstractFactory;
interface IUser {
public void insert(User user);
public User getUser(int id);
}
具体产品
使用场景
系统中有多于一个的产品族,而每次只使用其中某一产品族。
模式优缺点
优点
1、 抽象工厂隔离了具体类的生成,是的客户端不需要知道什么被创建。所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
2、 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
缺点
添加新的行为时比较麻烦。如果需要添加一个新产品族对象时,需要更改接口及其下所有子类,这必然会带来很大的麻烦。
模式总结
抽象工厂模式中主要的优点在于具体类的隔离,是的客户端不需要知道什么被创建了。其缺点在于增加新的等级产品结构比较复杂, 需要修改接口及其所有子类。