8-工厂方法模式版:造手机

好的!我们现在把上面那个“造手机”的抽象工厂模式示例,改写成工厂方法模式(Factory Method),并清晰说明它们之间的结构变化和逻辑差异


1. 🏭 工厂方法模式版:造手机

1.1. 📌 目标区别说明

对比项 抽象工厂模式 工厂方法模式
创建目标 一整套相关的产品(产品族) 单一产品的创建
接口内容 一个工厂接口定义多个产品的创建方法 每个工厂接口只定义一个产品的创建方法
扩展方式 添加新的产品族,需要新建一个工厂类 添加新产品,需要新建一个工厂类

我们现在就改写为:每个零件(屏幕、CPU、系统)各自一个“工厂接口 + 实现类”


1.2. ✅ Step-by-Step 改写为工厂方法模式


1.2.1. 1️⃣ 定义产品接口(和原来一样)

interface Screen {
    void display();
}

interface CPU {
    void process();
}

interface OS {
    void boot();
}


1.2.2. 2️⃣ 定义各自的工厂接口(每种产品一个接口)

interface ScreenFactory {
    Screen createScreen();
}

interface CPUFactory {
    CPU createCPU();
}

interface OSFactory {
    OS createOS();
}


1.2.3. 3️⃣ 实现 Apple 版产品 + 工厂

class AppleScreen implements Screen {
    public void display() {
        System.out.println("Retina display");
    }
}

class AppleCPU implements CPU {
    public void process() {
        System.out.println("A17 chip processing");
    }
}

class IOS implements OS {
    public void boot() {
        System.out.println("iOS booting");
    }
}

class AppleScreenFactory implements ScreenFactory {
    public Screen createScreen() {
        return new AppleScreen();
    }
}

class AppleCPUFactory implements CPUFactory {
    public CPU createCPU() {
        return new AppleCPU();
    }
}

class IOSFactory implements OSFactory {
    public OS createOS() {
        return new IOS();
    }
}


1.2.4. 4️⃣ 同理,实现 Samsung 产品 + 工厂

class SamsungScreen implements Screen {
    public void display() {
        System.out.println("AMOLED display");
    }
}
class SamsungCPU implements CPU {
    public void process() {
        System.out.println("Exynos chip processing");
    }
}
class AndroidOS implements OS {
    public void boot() {
        System.out.println("Android booting");
    }
}
class SamsungScreenFactory implements ScreenFactory {
    public Screen createScreen() {
        return new SamsungScreen();
    }
}
class SamsungCPUFactory implements CPUFactory {
    public CPU createCPU() {
        return new SamsungCPU();
    }
}
class AndroidOSFactory implements OSFactory {
    public OS createOS() {
        return new AndroidOS();
    }
}

1.2.5. 5️⃣ 使用工厂方法来构建产品(客户端)

public class PhoneAssemblyLine {
    public static void main(String[] args) {
        // Apple 套餐
        ScreenFactory screenFactory = new AppleScreenFactory();
        CPUFactory cpuFactory = new AppleCPUFactory();
        OSFactory osFactory = new IOSFactory();
        Screen screen = screenFactory.createScreen();
        CPU cpu = cpuFactory.createCPU();
        OS os = osFactory.createOS();
        screen.display();
        cpu.process();
        os.boot();
    }
}

1.3. 🧠 核心对比总结

特性 抽象工厂模式 工厂方法模式
工厂接口数量 1 个:负责创建所有产品(一个工厂抽象出多个方法) 每个产品一个工厂接口(单一职责)
扩展难度 添加新产品种类 → 修改工厂接口 添加新产品种类 → 只需添加新的工厂实现类
灵活性 更注重成套搭配,约束强 更灵活,可自由组合产品
适合场景 一整套产品需要一起用(产品之间强依赖) 各产品可独立创建、组合(产品之间相对独立)

1.4. 🎯 总结一句话

抽象工厂:我给你一整套搭配好的手机配件套餐(屏幕、CPU、系统一体)
工厂方法:你自己选每一个部件,屏幕一家,CPU 一家,系统一家,各买各的 🛒


如果你想,我也可以把这个改写版本转成 Markdown 给你放进 Obsidian !需要的话说一声~