想要多个相关对象?不用担心,抽象工厂一次性为你提供所有需要的对象,让它们亲密合作。

在软件设计中,我们经常需要创建多个相互依赖的对象,这些对象属于不同的产品系列,且它们之间有着紧密的协作关系。比如,在一个游戏中,你可能需要同时创建“英雄”和“武器”两类对象,而这两类对象往往是相互依赖、共同工作。想要同时创建这些对象?抽象工厂模式就可以帮你一次性解决!

趣味解读:让工厂帮你配对对象!

想象你是一个大厨,准备为宴会提供美味的菜肴。你有多个菜系(比如中餐、西餐、日式料理等),每个菜系都有一套相互搭配的配料和餐具。中餐可能配的是筷子和碗,西餐可能配的是刀叉和盘子。你不想一个个去挑选每个菜系的配料和餐具,而是希望一站式地获取完整的套餐。

于是,你走进了一个高级的“料理工厂”,这个工厂根据你选择的菜系,提供完整的餐具和配料。只要你告诉工厂你想要哪种菜系,它会为你配对好所有相关的对象,无论是配料、器具还是佐料,都能一应俱全。这样,你可以专心烹饪,无需为如何搭配每个部分而烦恼。这个工厂就像抽象工厂模式一样,帮你一次性提供所需的一整套相关对象。

Java代码案例:家具工厂

假设你正在开发一个家具应用,用户可以选择不同风格的家具(如现代、古典、简约等)。每种风格下的家具包括多个相关的组件(如沙发、椅子、茶几等),而每个组件都有不同的实现。你不想让每个用户都手动去创建这些家具组件,而是希望通过抽象工厂来一次性创建所有相关的家具组件。

// 1. 定义家具的接口
interface Chair {
    void sitOn();
}
​
interface Sofa {
    void lieOn();
}
​
// 2. 具体家具实现
class ModernChair implements Chair {
    public void sitOn() {
        System.out.println("Sitting on a modern chair.");
    }
}
​
class ModernSofa implements Sofa {
    public void lieOn() {
        System.out.println("Lying on a modern sofa.");
    }
}
​
class ClassicChair implements Chair {
    public void sitOn() {
        System.out.println("Sitting on a classic chair.");
    }
}
​
class ClassicSofa implements Sofa {
    public void lieOn() {
        System.out.println("Lying on a classic sofa.");
    }
}
​
// 3. 定义抽象工厂
interface FurnitureFactory {
    Chair createChair();
    Sofa createSofa();
}
​
// 4. 具体工厂实现
class ModernFurnitureFactory implements FurnitureFactory {
    public Chair createChair() {
        return new ModernChair();
    }
    public Sofa createSofa() {
        return new ModernSofa();
    }
}
​
class ClassicFurnitureFactory implements FurnitureFactory {
    public Chair createChair() {
        return new ClassicChair();
    }
    public Sofa createSofa() {
        return new ClassicSofa();
    }
}
​
public class Main {
    public static void main(String[] args) {
        FurnitureFactory modernFactory = new ModernFurnitureFactory();
        Chair modernChair = modernFactory.createChair();
        Sofa modernSofa = modernFactory.createSofa();
        
        modernChair.sitOn();
        modernSofa.lieOn();
​
        FurnitureFactory classicFactory = new ClassicFurnitureFactory();
        Chair classicChair = classicFactory.createChair();
        Sofa classicSofa = classicFactory.createSofa();
​
        classicChair.sitOn();
        classicSofa.lieOn();
    }
}

解析:

  • 抽象工厂接口(FurnitureFactory):提供创建家具的抽象方法,分别负责创建沙发和椅子。

  • 具体工厂类(ModernFurnitureFactory 和 ClassicFurnitureFactory):分别负责创建现代风格和经典风格的家具对象。

  • 具体家具类(ModernChair、ClassicChair、ModernSofa、ClassicSofa):具体实现每种家具的功能。

通过抽象工厂模式,我们可以根据需求创建不同风格的家具,而不需要关心每个家具组件的具体实现细节

实际应用场景:

  • UI 工具包:在开发跨平台应用时,可能需要针对不同平台(如 Windows、Mac、Linux)提供不同的界面组件(按钮、文本框等)。抽象工厂模式可以为不同平台提供相应的组件,同时确保这些组件能够协同工作。

  • 游戏开发:假设你在开发一个角色扮演游戏,不同的角色可能需要不同的装备(如武器、盔甲、道具等)。你可以通过抽象工厂为不同角色风格(如战士、法师、弓箭手等)提供完整的装备套件。

  • 操作系统主题:不同的操作系统或主题风格可能需要配合不同的界面组件。抽象工厂模式可以帮助你一次性创建并管理这些组件的实现。

总结

抽象工厂模式通过提供一整套相关产品的创建方法,让你在一次性获取所需的相关对象时,避免了在客户端代码中做过多的选择和搭配。它不仅解耦了对象的创建过程,还保证了不同对象之间的兼容性和协作性。使用抽象工厂模式,我们能够为不同的需求提供完整的产品套件,让系统更加灵活且易于扩展。