专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java设计模式-建造者模式(java建造者模式静态内部类)

temp10 2025-03-30 21:00:23 java教程 7 ℃ 0 评论

建造者模式定义:

建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式。它可以 将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方 法可以构造出不同表现(属性)的对象。
建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象 的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

Java设计模式-建造者模式(java建造者模式静态内部类)

角色构成:

Product(产品角色): 要创建的对象。

Builder(抽象建造者)创建一个Product对象的各个部件指定的 接口/抽象类。

ConcreteBuilder(具体建造者)实现了抽象建造者的抽象方法。具体建造者负责实际构建产品的各个部分

Director(指挥者)调用具体建造者来创建对象的各个部分,在指挥者中不涉及具体产品的信息,只负责按照一定的顺序调用具体建造者的方法。

建造者模式应用场景:

1、创建对象过程比较复杂且属性较多,需要经过多个步骤来创建一个完整的对象

例如,在游戏开发中,创建一个复杂的游戏角色。游戏角色可能有角色外观(包括发型、服装、肤色等)、角色技能(多种不同的技能组合)、角色属性(力量、敏捷、智力等)等多个部分。

2、对象的构建过程需要灵活配置

以汽车定制系统为例,用户可以选择不同的发动机、车身颜色、内饰配置等。

3、创建对象的算法(步骤)独立于对象的组成部分和装配方式

例如,在建筑设计软件中,建筑模型的构建步骤是相对固定的,如先设计地基,再构建墙体,最后添加屋顶。但是建筑模型的具体组成部分(如不同的建筑风格的墙体、多种形状的屋顶)可以有多种变化。

4、需要生成对象的不同表示形式

例如,在文档生成系统中,可能需要生成不同格式(如 PDF、HTML、Word)的文档。文档有一些共同的部分,如标题、正文、图表等,但每种格式的具体呈现方式(表示形式)不同。

建造者模式的主要优点:

1、扩展性好提高了代码的可复用性。

2、可以更加精细地控制产品的创建过程,可以使产品的构建过程更加清晰。

3、封装性好可以隐藏复杂对象的创建细节,创建和使用相分离。

建造者模式Java样例:

1、传统方式:

产品类

class Computer {
    private String cpu;
    private String memory;
    private String hardDisk;

    public Computer(String cpu, String memory, String hardDisk) {
        this.cpu = cpu;
        this.memory = memory;
        this.hardDisk = hardDisk;
    }

    public String getCpu() {
        return cpu;
    }

    public String getMemory() {
        return memory;
    }

    public String getHardDisk() {
        return hardDisk;
    }
}

抽象建造者

abstract class ComputerBuilder {
    public abstract void buildCpu();
    public abstract void buildMemory();
    public abstract void buildHardDisk();
    public abstract Computer getComputer();
}

具体建造者

class HighPerformanceComputerBuilder extends ComputerBuilder {
    private Computer computer;

    public HighPerformanceComputerBuilder() {
        computer = new Computer("", "", "");
    }

    @Override
    public void buildCpu() {
        computer.setCpu("Intel Core i9");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("32GB DDR5");
    }

    @Override
    public void buildHardDisk() {
        computer.setHardDisk("1TB SSD");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}

指挥官

class ComputerDirector {
    private ComputerBuilder builder;

    public ComputerDirector(ComputerBuilder builder) {
        this.builder = builder;
    }

    public Computer constructComputer() {
        builder.buildCpu();
        builder.buildMemory();
        builder.buildHardDisk();
        return builder.getComputer();
    }
}

使用示例

public class Main {
    public static void main(String[] args) {
        ComputerBuilder builder = new HighPerformanceComputerBuilder();
        ComputerDirector director = new ComputerDirector(builder);
        Computer computer = director.constructComputer();
        System.out.println("CPU: " + computer.getCpu() + ", Memory: " + computer.getMemory() + ", Hard Disk: " + computer.getHardDisk());
    }
}

2、链式调用

产品类(Product)

class User {
    private final String name;
    private final int age;
    private final String address;

    private User(UserBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getAddress() {
        return address;
    }

    public static class UserBuilder {
        private String name;
        private int age;
        private String address;

        public UserBuilder name(String name) {
            this.name = name;
            return this;
        }

        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }

        public UserBuilder address(String address) {
            this.address = address;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}

使用示例

public class Main {
    public static void main(String[] args) {
        User user = new User.UserBuilder()
               .name("John")
               .age(30)
               .address("123 Main St")
               .build();
        System.out.println("Name: " + user.getName() + ", Age: " + user.getAge() + ", Address: " + user.getAddress());
    }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表