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

createh52个月前 (02-01)技术教程13

建造者模式定义:

建造者模式(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方法分为哪和类,每类方法是如何调用的?)

作者:Grady_Camel来源:简书根据方法的来源,可以将方法简单地分为用户自定义的方法和非自定义的方法(亦即系 统提供的方法) 1.自定义方法 自定义方法是在类中为了解决某个问题而编写的一段功能代...

Java内部类的四种分类以及作用(java内部类的类型)

一、内部类内容解析1. 内部类的区分内部类分别有成员内部类、局部内部类、匿名内部类、静态内部类,接下来将分别介绍。2. 成员内部类就是位于外部类成员位置的类。与外部类的属性、方法并列。成员内部类作为外...

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

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

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

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

萨克斯各类哨片有什么不同又该如何挑选!一定要找到适合自己的

哨片作为萨克斯演奏的必需品有许多萨克斯爱好者称其为“口粮”,这种形容最恰当不过,可既然是必需品每天都是如此那就要想办法让它变得符合自己的口味,不然不仅仅是吹不好更重要的是吹的难受会影响到学习热情,今天...

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

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