创建型设计模式之抽象工厂模式

115 阅读2分钟

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. 和工厂方法模式的区别

抽象工厂模式与工厂模式的区别在于:抽象工厂是可以生产多个产品的,而工厂方法模式只能生产一个产品。

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。

抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。