Java设计模式-建造者模式(java设计模式视频教程)

createh54个月前 (02-01)技术教程19

建造者模式定义:

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

角色构成:

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

相关文章

你都知道哪些Java锁分类(java锁的种类以及辨析)

在多线程环境下,由于多个线程可以同时访问和修改共享资源,如果没有采取相应的措施来保护共享资源,就可能会出现数据竞争、死锁、活锁等问题,导致程序出现不稳定或不可预期的结果或错误,这些称为"线程安全"问题...

基岩版我的世界自动分类装置(详细介绍运作原理)

大家好,我是我要吃煎蛋,欢迎大家阅读本期内容。今天带大家了解一下单人生存可以使用的简易自动分类装置~我推荐最好先做出这个东西,然后再回来研究它的原理,明白了以后,才能做出它,然后根据原理才能做出更多有...

你必须掌握的 21 个 Java 核心技术

选择 优质文章,及时送达经过这么多年的Java开发,以及结合平时面试Java开发者的一些经验,我觉得对于J2SE方面主要就是要掌握以下的一些内容。1. JVM相关对于刚刚接触Java的人来说,JVM相...

好不容易总结的几款开源自动化测试框架的优缺点对比

1. Robot FrameworkRobot Framework(RF)是用于验收测试和验收测试驱动开发(ATDD)的自动化测试框架。 基于 Python 编写,但也可以在 Jython(Java)...

telnet命令的用法(telnet命令怎么看端口通不通)

首先单击左下角的“开始”按钮以打开“开始”菜单,然后打开“控制面板”进入控制面板后,在“查看方法”为类别时单击“程序”打开“程序”页面后,单击“程序和功能”下的“打开或关闭Windows功能”之后,您...

Java中的锁是什么意思,有哪些分类?

Java锁(Java Locks)是Java编程语言中用于实现多线程同步和互斥的机制。在并发编程中,多线程同时访问共享资源可能导致竞态条件(Race Condition)和其他并发问题,Java锁提供...