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

💎 总结

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

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

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

相关推荐
MarcoPage17 分钟前
Python 字典推导式入门:一行构建键值对映射
java·linux·python
脸大是真的好~17 分钟前
黑马JAVAWeb-11 请求参数为数组-XML自动封装-XML手动封装-增删改查-全局异常处理-单独异常分别处理
java
Hello.Reader3 小时前
Data Sink定义、参数与可落地示例
java·前端·网络
2401_837088504 小时前
stringRedisTemplate.opsForHash().entries
java·redis
lkbhua莱克瓦245 小时前
Java基础——集合进阶3
java·开发语言·笔记
蓝-萧6 小时前
使用Docker构建Node.js应用的详细指南
java·后端
多喝开水少熬夜6 小时前
Trie树相关算法题java实现
java·开发语言·算法
执笔论英雄6 小时前
【大模型训练】加载load_state 中的一些技巧 工厂设计模式
设计模式
lkbhua莱克瓦246 小时前
Java基础——集合进阶用到的数据结构知识点1
java·数据结构·笔记·github
音符犹如代码7 小时前
Java并发List实战:CopyOnWriteArrayList原理与ArrayList常见面试题
java·开发语言·面试·list