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();
}

💎 总结

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

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

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

相关推荐
せいしゅん青春之我11 小时前
[JavaEE初阶]网络协议-状态码
java·网络协议·http
shepherd11111 小时前
JDK源码深潜(一):从源码看透DelayQueue实现
java·后端·代码规范
天天摸鱼的java工程师12 小时前
SpringBoot + OAuth2 + Redis + MongoDB:八年 Java 开发教你做 “安全不泄露、权限不越界” 的 SaaS 多租户平台
java·后端
鹿里噜哩12 小时前
Nacos跨Group及Namespace发现服务
java·spring cloud
沐浴露z12 小时前
【JVM】详解 对象的创建
java·jvm
weixin_4454766812 小时前
Java并发编程——提前聊一聊CompletableFuture和相关业务场景
java·并发·异步
ChinaRainbowSea12 小时前
11. Spring AI + ELT
java·人工智能·后端·spring·ai编程
不会写DN12 小时前
用户头像文件存储功能是如何实现的?
java·linux·后端·golang·node.js·github
聪明的笨猪猪12 小时前
Java JVM “类加载与虚拟机执行” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
盖世英雄酱5813612 小时前
FullGC排查,居然是它!
java·后端