设计模式之抽象工厂模式

1.创建抽象产品的接口

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

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

作用

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

2.具体产品实现

2.1.苹果牌的电话和耳机

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

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

作用

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

2.2.华为牌的手机和耳机

java 复制代码
// 华为手机
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.抽象工厂接口

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

作用

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

4.实现抽象工厂

4.1.苹果工厂

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

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

作用

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

4.2.华为工厂

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

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

作用

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

5.用户

java 复制代码
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),就能得到 配套的同一品牌产品
  • 完全不用关心 iPhoneMatePhone 的具体实现细节

总结

总结各部分的协作关系

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

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

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

  1. 创建 XiaomiPhoneXiaomiEarphone 类(实现 PhoneEarphone 接口)
  2. 创建 XiaomiFactory 类(实现 TechFactory 接口)
  3. 原有代码完全不用修改
相关推荐
快乐源泉1 小时前
【设计模式】桥接,是设计模式?对,其实你用过
后端·设计模式·go
Auroral1562 小时前
创建型模式:抽象工厂模式
设计模式
都叫我大帅哥2 小时前
代码界的「海关检查」:访问者模式的签证艺术
java·后端·设计模式
小马爱打代码2 小时前
设计模式:代理模式 - 控制访问与增强功能的艺术
设计模式·代理模式
wenbin_java2 小时前
设计模式之备忘录模式:对象状态的可逆时光机
java·设计模式·备忘录模式
都叫我大帅哥3 小时前
遍历世界的通行证:迭代器模式的导航艺术
java·后端·设计模式
未定义.22114 小时前
UML-银行取款序列图
设计模式·流程图·软件工程·需求分析·uml
程序员沉梦听雨17 小时前
外观模式详解
java·设计模式·外观模式
小马爱打代码18 小时前
设计模式:策略模式 - 消除复杂条件判断的利器
设计模式·策略模式
诺亚凹凸曼19 小时前
23种设计模式-行为型模式-访问者
设计模式