
抽象工厂模式 (Abstract Factory)
想要多个相关对象?不用担心,抽象工厂一次性为你提供所有需要的对象,让它们亲密合作。
在软件设计中,我们经常需要创建多个相互依赖的对象,这些对象属于不同的产品系列,且它们之间有着紧密的协作关系。比如,在一个游戏中,你可能需要同时创建“英雄”和“武器”两类对象,而这两类对象往往是相互依赖、共同工作。想要同时创建这些对象?抽象工厂模式就可以帮你一次性解决!
趣味解读:让工厂帮你配对对象!
想象你是一个大厨,准备为宴会提供美味的菜肴。你有多个菜系(比如中餐、西餐、日式料理等),每个菜系都有一套相互搭配的配料和餐具。中餐可能配的是筷子和碗,西餐可能配的是刀叉和盘子。你不想一个个去挑选每个菜系的配料和餐具,而是希望一站式地获取完整的套餐。
于是,你走进了一个高级的“料理工厂”,这个工厂根据你选择的菜系,提供完整的餐具和配料。只要你告诉工厂你想要哪种菜系,它会为你配对好所有相关的对象,无论是配料、器具还是佐料,都能一应俱全。这样,你可以专心烹饪,无需为如何搭配每个部分而烦恼。这个工厂就像抽象工厂模式一样,帮你一次性提供所需的一整套相关对象。
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)提供不同的界面组件(按钮、文本框等)。抽象工厂模式可以为不同平台提供相应的组件,同时确保这些组件能够协同工作。
游戏开发:假设你在开发一个角色扮演游戏,不同的角色可能需要不同的装备(如武器、盔甲、道具等)。你可以通过抽象工厂为不同角色风格(如战士、法师、弓箭手等)提供完整的装备套件。
操作系统主题:不同的操作系统或主题风格可能需要配合不同的界面组件。抽象工厂模式可以帮助你一次性创建并管理这些组件的实现。
总结
抽象工厂模式通过提供一整套相关产品的创建方法,让你在一次性获取所需的相关对象时,避免了在客户端代码中做过多的选择和搭配。它不仅解耦了对象的创建过程,还保证了不同对象之间的兼容性和协作性。使用抽象工厂模式,我们能够为不同的需求提供完整的产品套件,让系统更加灵活且易于扩展。