设计模式之抽象工厂模式

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. 原有代码完全不用修改
相关推荐
端庄的战斗机4 小时前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式
饼干哥哥10 小时前
我开发了一个「吃掉」别人Skill来升级的饕餮.Skill,现在免费开源
人工智能·设计模式·开源
CaffeinePro11 小时前
什么是系统架构?架构师到底在做什么?
设计模式·架构
AI人工智能+电脑小能手13 小时前
【大白话说Java面试题 第156题】【06_Spring篇】第16题:Spring 用到了哪些设计模式?
java·spring·设计模式·代理模式·工厂模式
前端百草阁15 小时前
JavaScript 设计模式(23 种)
开发语言·前端·javascript·设计模式
geovindu15 小时前
java: Singleton Pattern
java·开发语言·后端·单例模式·设计模式·创建型模式
geovindu1 天前
python: Functional Options Pattern
开发语言·后端·python·设计模式·惯用法模式·函数式选项模式
Kel1 天前
Pregel 为什么会成为LangGraph编排的心脏
人工智能·设计模式·架构
会周易的程序员2 天前
microLog 后端开发指南
开发语言·c++·物联网·设计模式·日志·iot·aiot
geovindu2 天前
go: Functional Options Pattern
开发语言·后端·设计模式·golang·函数式选项模式’·惯用法模式