设计模式之抽象工厂模式

发布于:2025-03-21 ⋅ 阅读:(19) ⋅ 点赞:(0)

1.创建抽象产品的接口

// 手机的标准功能
interface Phone {
    void call(); // 必须能打电话
}

// 耳机的标准功能
interface Earphone {
    void playSound(); // 必须能播放声音
}

作用

  • 定义产品的 ​统一标准​(比如所有手机都必须能打电话)
  • 让不同品牌的产品 ​遵守相同规则,比如苹果和华为的手机都必须实现 call() 方法

2.具体产品实现

2.1.苹果牌的电话和耳机

// 苹果手机
class iPhone implements Phone {
    @Override
    public void call() {
        System.out.println("iPhone 打电话");
    }
}

// 苹果耳机
class AirPods implements Earphone {
    @Override
    public void playSound() {
        System.out.println("AirPods 播放音乐");
    }
}

作用

  • 实现抽象接口,给出苹果产品的具体功能
  • 比如 iPhone 的 call() 方法打印自己的特色信息

2.2.华为牌的手机和耳机

// 华为手机
class MatePhone implements Phone {
    @Override
    public void call() {
        System.out.println("华为 MatePhone 打电话");
    }
}

// 华为耳机
class FreeBuds implements Earphone {
    @Override
    public void playSound() {
        System.out.println("华为 FreeBuds 播放音乐");
    }
}

作用

  • 同上,但实现的是 ​华为品牌 的具体功能
  • 不同品牌的产品 ​实现相同接口,但细节不同(比如打印的品牌名称)

3.抽象工厂接口

interface TechFactory {
    Phone createPhone();     // 工厂能生产手机
    Earphone createEarphone(); // 工厂能生产耳机
}

作用

  • 定义工厂的 ​能力,比如每个工厂必须能生产手机和耳机
  • 确保不同品牌的工厂 ​生产同一套产品​(比如苹果工厂生产手机+耳机,华为工厂也生产手机+耳机)

4.实现抽象工厂 

4.1.苹果工厂

class AppleFactory implements TechFactory {
    @Override
    public Phone createPhone() {
        return new iPhone(); // 生产苹果手机
    }

    @Override
    public Earphone createEarphone() {
        return new AirPods(); // 生产苹果耳机
    }
}

作用

  • 实现抽象工厂,具体生产苹果的产品
  • 当调用 createPhone() 时,返回 iPhone 对象

 4.2.华为工厂

class HuaweiFactory implements TechFactory {
    @Override
    public Phone createPhone() {
        return new MatePhone(); // 生产华为手机
    }

    @Override
    public Earphone createEarphone() {
        return new FreeBuds(); // 生产华为耳机
    }
}

作用

  • 同上,但生产的是华为的产品
  • 当调用 createEarphone() 时,返回 FreeBuds 对象

5.用户

public class Client {
    public static void main(String[] args) {
        // 选择苹果工厂
        TechFactory appleFactory = new AppleFactory();
        Phone myPhone = appleFactory.createPhone();
        Earphone myEarphone = appleFactory.createEarphone();
        myPhone.call();         // 输出:iPhone 打电话
        myEarphone.playSound(); // 输出:AirPods 播放音乐

        // 选择华为工厂
        TechFactory huaweiFactory = new HuaweiFactory();
        Phone hwPhone = huaweiFactory.createPhone();
        Earphone hwEarphone = huaweiFactory.createEarphone();
        hwPhone.call();         // 输出:华为 MatePhone 打电话
        hwEarphone.playSound(); // 输出:华为 FreeBuds 播放音乐
    }
}

关键逻辑

  • 用户只需 ​选择一个工厂​(比如 AppleFactory),就能得到 ​配套的同一品牌产品
  • 完全不用关心 iPhone 或 MatePhone 的具体实现细节

总结 

总结各部分的协作关系

  1. 抽象产品​(接口)定义规则 → ​具体产品​(类)实现规则
  2. 抽象工厂​(接口)定义能力 → ​具体工厂​(类)实现生产
  3. 用户通过选择工厂 → ​获得整套配套产品

扩展性示例(加一个小米工厂)​

如果未来要新增 ​小米品牌,只需:

  1. 创建 XiaomiPhone 和 XiaomiEarphone 类(实现 Phone 和 Earphone 接口)
  2. 创建 XiaomiFactory 类(实现 TechFactory 接口)
  3. 原有代码完全不用修改