java设计模式:工厂方法 + 建造者模式

模式结合设计方案

这个设计充分利用了两种模式的优势:​​工厂方法负责创建不同类型产品的建造者​​,而​​建造者模式负责分步骤构造复杂产品​​

类结构设计

md 复制代码
- Computer (产品)
- ComputerBuilder (抽象建造者) 
- GamingComputerBuilder, OfficeComputerBuilder (具体建造者)
- ComputerBuilderFactory (建造者工厂)
- ComputerDirector (指挥者)

💻 完整代码实现

  1. 产品类 - Computer
java 复制代码
public class Computer {
    private String cpu;
    private String memory;
    private String storage;
    private String graphicsCard;
    private String powerSupply;
    
    // 私有构造函数,只能通过建造者构建
    private Computer() {}
    
    // Setter方法
    public void setCpu(String cpu) { this.cpu = cpu; }
    public void setMemory(String memory) { this.memory = memory; }
    public void setStorage(String storage) { this.storage = storage; }
    public void setGraphicsCard(String graphicsCard) { this.graphicsCard = graphicsCard; }
    public void setPowerSupply(String powerSupply) { this.powerSupply = powerSupply; }
    
    @Override
    public String toString() {
        return String.format("Computer[CPU=%s, Memory=%s, Storage=%s, Graphics=%s, Power=%s]", 
                           cpu, memory, storage, graphicsCard, powerSupply);
    }
}
  1. 抽象建造者 - ComputerBuilder
java 复制代码
public interface ComputerBuilder {
    void buildCpu();
    void buildMemory();
    void buildStorage();
    void buildGraphicsCard();
    void buildPowerSupply();
    Computer getResult();
}
  1. 具体建造者 - 游戏电脑和办公电脑
java 复制代码
// 游戏电脑建造者
public class GamingComputerBuilder implements ComputerBuilder {
    private Computer computer;
    
    public GamingComputerBuilder() {
        this.computer = new Computer();
    }
    
    @Override
    public void buildCpu() {
        computer.setCpu("Intel Core i9-13900K");
    }
    
    @Override
    public void buildMemory() {
        computer.setMemory("32GB DDR5 RGB");
    }
    
    @Override
    public void buildStorage() {
        computer.setStorage("2TB NVMe SSD + 4TB HDD");
    }
    
    @Override
    public void buildGraphicsCard() {
        computer.setGraphicsCard("NVIDIA GeForce RTX 4090");
    }
    
    @Override
    public void buildPowerSupply() {
        computer.setPowerSupply("1200W 80+ Platinum");
    }
    
    @Override
    public Computer getResult() {
        return computer;
    }
}

// 办公电脑建造者
public class OfficeComputerBuilder implements ComputerBuilder {
    private Computer computer;
    
    public OfficeComputerBuilder() {
        this.computer = new Computer();
    }
    
    @Override
    public void buildCpu() {
        computer.setCpu("Intel Core i5-12400");
    }
    
    @Override
    public void buildMemory() {
        computer.setMemory("16GB DDR4");
    }
    
    @Override
    public void buildStorage() {
        computer.setStorage("512GB NVMe SSD");
    }
    
    @Override
    public void buildGraphicsCard() {
        computer.setGraphicsCard("Integrated Intel UHD Graphics");
    }
    
    @Override
    public void buildPowerSupply() {
        computer.setPowerSupply("550W 80+ Bronze");
    }
    
    @Override
    public Computer getResult() {
        return computer;
    }
}
  1. 工厂方法 - 建造者工厂
java 复制代码
public class ComputerBuilderFactory {
    public enum ComputerType {
        GAMING, OFFICE
    }
    
    public static ComputerBuilder createBuilder(ComputerType type) {
        switch (type) {
            case GAMING:
                return new GamingComputerBuilder();
            case OFFICE:
                return new OfficeComputerBuilder();
            default:
                throw new IllegalArgumentException("不支持的电脑类型: " + type);
        }
    }
}
  1. 指挥者 - ComputerDirector
java 复制代码
public class ComputerDirector {
    public Computer construct(ComputerBuilder builder) {
        // 统一的构建流程,确保所有电脑都按正确顺序组装
        builder.buildCpu();
        builder.buildMemory();
        builder.buildStorage();
        builder.buildGraphicsCard();
        builder.buildPowerSupply();
        return builder.getResult();
    }
    
    // 可选的快速构建方法
    public Computer constructGamingComputer() {
        ComputerBuilder builder = ComputerBuilderFactory.createBuilder(
            ComputerBuilderFactory.ComputerType.GAMING);
        return construct(builder);
    }
    
    public Computer constructOfficeComputer() {
        ComputerBuilder builder = ComputerBuilderFactory.createBuilder(
            ComputerBuilderFactory.ComputerType.OFFICE);
        return construct(builder);
    }
}
  1. 客户端使用
java 复制代码
public class Client {
    public static void main(String[] args) {
        ComputerDirector director = new ComputerDirector();
        
        // 方式1:通过工厂方法创建具体建造者,然后指挥者构建
        System.out.println("=== 方式1:分步构建 ===");
        ComputerBuilder gamingBuilder = ComputerBuilderFactory.createBuilder(
            ComputerBuilderFactory.ComputerType.GAMING);
        Computer gamingComputer = director.construct(gamingBuilder);
        System.out.println("游戏电脑: " + gamingComputer);
        
        // 方式2:直接使用指挥者的快捷方法
        System.out.println("\n=== 方式2:快捷构建 ===");
        Computer officeComputer = director.constructOfficeComputer();
        System.out.println("办公电脑: " + officeComputer);
        
        // 方式3:动态根据配置构建
        System.out.println("\n=== 方式3:动态构建 ===");
        String userPreference = "performance"; // 可以从配置文件中读取
        Computer dynamicComputer;
        
        if ("performance".equals(userPreference)) {
            dynamicComputer = director.constructGamingComputer();
        } else {
            dynamicComputer = director.constructOfficeComputer();
        }
        System.out.println("动态配置电脑: " + dynamicComputer);
    }
}

✨ 设计模式的优越性体现

🎯 ​​关注点分离与职责清晰​​

​​工厂方法​​专注于创建适当类型的建造者对象

​​建造者模式​​专注于分步骤构造复杂产品

​​指挥者​​控制构建过程,确保一致性

🔄 ​​极高的灵活性和可扩展性​​

新增电脑类型时,只需要增加新的具体建造者,无需修改现有代码:

java 复制代码
// 新增轻薄本建造者
public class UltrabookComputerBuilder implements ComputerBuilder {
    // 实现所有构建方法...
}

// 在工厂中注册新类型
public static ComputerBuilder createBuilder(ComputerType type) {
    switch (type) {
        case GAMING: return new GamingComputerBuilder();
        case OFFICE: return new OfficeComputerBuilder();
        case ULTRABOOK: return new UltrabookComputerBuilder(); // 新增
        default: throw new IllegalArgumentException("不支持的电脑类型: " + type);
    }
}

🛡️ ​​构建过程的质量保证​​

指挥者确保了所有电脑都按照正确的顺序和标准构建:

java 复制代码
public Computer construct(ComputerBuilder builder) {
    // 必须的顺序:先装基础部件,再装扩展部件
    builder.buildCpu();          // 第一步:安装CPU
    builder.buildMemory();       // 第二步:安装内存
    builder.buildStorage();      // 第三步:安装存储
    builder.buildGraphicsCard(); // 第四步:安装显卡
    builder.buildPowerSupply();  // 第五步:安装电源
    return builder.getResult();
}

💎 总结

这种结合模式充分发挥了各自的优势:​​工厂方法提供了创建对象的灵活性​​,而​​建造者模式提供了构建复杂对象的精细控制​​

这种设计使得系统在面对变化时更加健壮,特别是在需要创建具有复杂内部结构的对象时,优势更加明显。

当你的系统需要创建多种类型的复杂对象,且每种对象都有自己特定的构建过程时,考虑使用这种工厂方法与建造者模式的组合,它能为你带来更好的代码结构性和可维护性。

相关推荐
七月丶25 分钟前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞33 分钟前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼1 小时前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
SimonKing2 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean2 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven973 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55112 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河12 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程15 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读