10

创建型设计模式之建造者模式_积跬步,至千里。的技术博客_51CTO博客

 3 years ago
source link: https://blog.51cto.com/chencoding/5634942
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

创建型设计模式之建造者模式

精选 原创

丨Jack_Chen丨 2022-08-30 21:19:44 博主文章分类:设计模式 ©著作权

文章标签 建造者 建造者模式 java 设计模式 文章分类 Java 编程语言 阅读数249

创建型设计模式之建造者模式

建造者模式

建造者模式(Builder Pattern)属于创建型模式。它是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

简而言之:建造者模式就是使用多个简单的对象一步一步构建成一个复杂的对象。

建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定。如果一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和使用进行分离。

JDK的StringBuilder类中append()方法,提供了开放构造步骤,最后调用toString0方法就可以获得一个构造好的完整字符串。其就是一个建造者模式的体现。

创建型设计模式之建造者模式_设计模式

建造者模式提供四个主要角色:

1.产品(Product)

要创建的产品类对象。

2.建造者抽象(Builder)

建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的建造过程。

3.建造者(ConcreteBuilder)

具体的Builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建。

4.调用者(Director)

调用具体的建造者,来创建对象的各个部分,在指导者中不涉及具体产品的信息,只负责保正对象各部分完整创建或按某种顺序创建。

创建型设计模式之建造者模式_设计模式_02
1.封装性好,创建和使用分离。

2.扩展性好,建造类之间独立、一定程度上解耦。
1.产生多余的Builder对象。

2.产品内部发生变化,建造者都要修改,成本较大。
1.需要生成的对象具有复杂的内部结构。

2.需要生成的对象内部属性本身相互依赖。

3.相同的方法,不同的执行顺序,产生不同的结果。

4.当初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时。

生产一辆Car的过程,需要一系列的步骤,假设这些步骤可以随意调整组合。

创建产品类

public class Car {
    /**
     * 名称
     */
    private String name;
    /**
     * 颜色
     */
    private String color;
    /**
     * 价格
     */
    private String price;
    /**
     * 类型
     */
    private String type;
    /**
     * 发动机
     */
    private String engine;
    /**
     * 轮子
     */
    private String wheel;
}

创建建造者类

创建建造者类,将复杂的构造过程封装起来,构造步骤由使用者决定

public class CarBuilder {
    private Car car = new Car();

    public CarBuilder addName(String name) {
        car.setName(name);
        return this;
    }
    public CarBuilder addColor(String color) {
        car.setColor(color);
        return this;
    }
    public CarBuilder addPrice(String price) {
        car.setPrice(price);
        return this;
    }
    public CarBuilder addType(String type) {
        car.setType(type);
        return this;
    }
    public CarBuilder addEngine(String engine) {
        car.setEngine(engine);
        return this;
    }
    public CarBuilder addWheel(String wheel) {
        car.setWheel(wheel);
        return this;
    }
    public Car build() {
        return car;
    }
}
    public static void main(String[] args) {
        CarBuilder carBuilder = new CarBuilder();
        Car car = carBuilder.addName("奔驰")
                .addColor("红色")
                .addPrice("100万")
                .addType("轿车")
                .addEngine("1.8T")
                .addWheel("18寸")
                .build();
        System.out.println(car);
    }

建造者模式通常是采用链式编程的方式构造对象。

具体做法:

将产品类添加到建造者类中作为内部类,然后将构造步骤添加进去,完成每个步骤,都返回this关键字。

创建产品类与建造者类

public class CarBuilder {
    @Data
    public class Car {
        /**
         * 品牌
         */
        private String name;
        /**
         * 颜色
         */
        private String color;
        /**
         * 价格
         */
        private String price;
        /**
         * 类型
         */
        private String type;
        /**
         * 发动机
         */
        private String engine;
        /**
         * 轮子
         */
        private String wheel;
    }

    private Car car = new Car();

    public CarBuilder addName(String name) {
        car.setName(name);
        return this;
    }

    public CarBuilder addColor(String color) {
        car.setColor(color);
        return this;
    }

    public CarBuilder addPrice(String price) {
        car.setPrice(price);
        return this;
    }

    public CarBuilder addType(String type) {
        car.setType(type);
        return this;
    }

    public CarBuilder addEngine(String engine) {
        car.setEngine(engine);
        return this;
    }

    public CarBuilder addWheel(String wheel) {
        car.setWheel(wheel);
        return this;
    }

    public Car build() {
        return car;
    }
}
    public static void main(String[] args) {
        CarBuilder carBuilder = new CarBuilder();
        carBuilder.addName("奔驰").addColor("红色").addPrice("100万").addType("跑车").addEngine("发动机").addWheel("轮子");
        CarBuilder.Car car = carBuilder.build();
        System.out.println(car);
    }
  • 收藏
  • 评论
  • 分享
  • 举报

</div


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK