抽象工厂模式

抽象工厂模式是工厂方法模式的升级版,属于创建型设计模式。其目的是提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类,从而可以使应用程序在不指定具体类的情况下,创建一系列相关对象。

抽象工厂模式的角色

  1. 抽象工厂(AbstractFactory):它声明了一组用于创建不同产品的方法,这些方法返回抽象产品,是工厂方法的核心类,通常使用接口或抽象类实现,而每个具体工厂都继承了该接口或抽象类。

  2. 具体工厂(ConcreteFactory):它实现了抽象工厂接口,负责创建一个产品家族,例子中即为 AppleFactorySamsungFactory

  3. 抽象产品(AbstractProduct):它为每种产品声明接口,在该产品所对应的类中实现,例子中即为 PhoneComputer

  4. 具体产品(ConcreteProduct):它定义具体工厂生产的具体产品,该产品只能由相应的具体工厂创建,例子中即为 IPhoneIPadMacBookNotebook

Java示例

以抽象工厂模式创建手机和电脑为例,假设需要创建苹果品牌和三星品牌的手机和电脑,而这些手机和电脑又要求相互配合使用。我们首先定义抽象产品PhoneComputer

// 抽象手机类
public interface Phone {
    void run();
}

// 抽象电脑类
public interface Computer {
    void execute();
}

然后定义具体产品IPhoneIPadMacBookNotebook,分别对应苹果品牌和三星品牌的手机和电脑:

// 苹果品牌手机
public class IPhone implements Phone {
    @Override
    public void run() {
        System.out.println("IPhone run.");
    }
}

// 苹果品牌电脑
public class MacBook implements Computer {
    @Override
    public void execute() {
        System.out.println("MacBook execute.");
    }
}

// 三星品牌手机
public class Notebook implements Computer {
    @Override
    public void execute() {
        System.out.println("Notebook execute.");
    }
}

// 三星品牌电脑
public class SamsungPhone implements Phone {
    @Override
    public void run() {
        System.out.println("SamsungPhone run.");
    }
}

接着定义抽象工厂AbstractFactory,它包含生产手机和电脑的方法:

// 抽象工厂
public interface AbstractFactory {
    Phone createPhone();
    Computer createComputer();
}

然后定义具体品牌工厂类AppleFactorySamsungFactory,分别用于创建苹果品牌和三星品牌的手机和电脑:

// 苹果品牌工厂
public class AppleFactory implements AbstractFactory {
    @Override
    public Phone createPhone() {
        return new IPhone();
    }

    @Override
    public Computer createComputer() {
        return new MacBook();
    }
}

// 三星品牌工厂
public class SamsungFactory implements AbstractFactory {
    @Override
    public Phone createPhone() {
        return new SamsungPhone();
    }

    @Override
    public Computer createComputer() {
        return new Notebook();
    }
}

最后,在客户端代码中,我们利用抽象工厂分别创建苹果品牌和三星品牌的手机和电脑:

// 创建苹果品牌手机和电脑
AbstractFactory appleFactory = new AppleFactory();
Phone iphone = appleFactory.createPhone();
Computer macbook = appleFactory.createComputer();
iphone.run();
macbook.execute();

// 创建三星品牌手机和电脑
AbstractFactory samsungFactory = new SamsungFactory();
Phone samsungPhone = samsungFactory.createPhone();
Computer notebook = samsungFactory.createComputer();
samsungPhone.run();
notebook.execute();

这样就完成了抽象工厂模式的Java演示。

优点和缺点

优点:

  1. 抽象工厂模式分离了具体类的生产,使得客户端不必对具体的产品进行关联,降低了客户端使用不同种类产品的复杂度;
  2. 抽象工厂模式使得客户端不必知道具体工厂类,只需要知道抽象工厂即可,降低了客户端与具体实现类之间的耦合度;
  3. 抽象工厂模式增加新品牌或产品变得容易,只需要增加相应的工厂和产品类即可,符合“开放-关闭原则”。

缺点:

  1. 抽象工厂模式的扩展性受到工厂方法模式的影响,可扩展性不是很灵活,因此当需要增加新的产品系列时,需要修改抽象工厂的接口,这需要同时修改所有的实现类,与“开放-关闭原则”有冲突;
  2. 抽象工厂模式的复杂度比较高,对于小规模的项目,不如简单工厂模式或工厂方法模式实用。

综上所述,抽象工厂模式能够为系统提供更高层次的抽象化,可以满足不同的客户端请求,从而提高系统的灵活性和可维护性。但是,也需要在具体使用时根据实际需要进行选择,遵循相应的规范和要求,才能发挥出抽象工厂模式的优点。