设计模式之抽象工厂模式

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. 原有代码完全不用修改
相关推荐
on the way 12312 小时前
结构性设计模式之Flyweight(享元)
java·设计模式·享元模式
暴躁哥16 小时前
深入理解设计模式之访问者模式
设计模式·访问者模式
佩奇的技术笔记17 小时前
从Java的JDK源码中学设计模式之装饰器模式
java·设计模式·装饰器模式
on the way 12317 小时前
结构型设计模式之Proxy(代理)
设计模式·代理模式
YGGP20 小时前
【结构型模式】装饰器模式
设计模式
将编程培养成爱好1 天前
《复制粘贴的奇迹:小明的原型工厂》
c++·设计模式·原型模式
liang_jy1 天前
设计模式中的几大原则
设计模式·面试
huangyujun99201231 天前
设计模式杂谈-模板设计模式
java·设计模式
magic 2451 天前
Java设计模式:责任链模式
java·设计模式·责任链模式
YGGP1 天前
【结构型模式】代理模式
设计模式