1. 抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)定义:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
有A、B两个产品族,每个产品族有1、2两个级别。通过下面代码可以看出,产品族扩展很难,产品等级扩展很容易。
1.1. 产品类
1.1.1. 抽象产品类
public abstract class AbstractProductA {
//共有的方法
public void shareMethod() {}
public abstract void doSomething();
}
public abstract class AbstractProductB {
//共有的方法
public void shareMethod() {}
public abstract void doSomething();
}
1.1.2. 产品实现类
public class ProductA1 extends AbstractProductA{
@Override
public void doSomething() {
System.out.println("产品A1的实现方法");
}
}
public class ProductA2 extends AbstractProductA{
@Override
public void doSomething() {
System.out.println("产品A2的实现方法");
}
}
public class ProductB1 extends AbstractProductB{
@Override
public void doSomething() {
System.out.println("产品B1的实现方法");
}
}
public class ProductB2 extends AbstractProductB{
@Override
public void doSomething() {
System.out.println("产品B2的实现方法");
}
}
1.2. 工厂类
1.2.1. 抽象工厂类
根据产品族,有几个产品族,在抽象工厂类中就应该有几个产品创建方法。
public abstract class AbstractCreator {
//创建A产品家族
public abstract AbstractProductA createProductA();
//创建B产品家族
public abstract AbstractProductB createProductB();
}
1.2.2. 工厂实现类
根据产品级别,有几个产品级别,就应该有几个工厂实现类,在每个实现工厂中,实现不同产品族的生产任务。
public class Creator1 extends AbstractCreator{
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}
public class Creator2 extends AbstractCreator{
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
2. 和工厂方法模式的区别
抽象工厂模式与工厂模式的区别在于:抽象工厂是可以生产多个产品的,而工厂方法模式只能生产一个产品。
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。
抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。