日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

創建型設計模式之建造者模式

作者:丨Jack_Chen丨 更新時間: 2022-08-15 編程語言

創建型設計模式之建造者模式

  • 建造者模式
    • 概述
    • 角色
    • 優缺點
    • 應用場景
  • 基本使用
    • 創建產品類
    • 創建建造者類
    • 使用
  • 鏈式寫法
    • 創建產品類與建造者類
    • 使用

建造者模式

概述

建造者模式(Builder Pattern)屬于創建型模式

它是將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。

簡而言之:建造者模式就是使用多個簡單的對象一步一步構建成一個復雜的對象。

建造者模式適用于創建對象需要很多步驟,但是步驟的順序不一定固定。如果一個對象有非常復雜的內部結構(很多屬性),可以將復雜對象的創建和使用進行分離。

JDK的StringBuilder類中append()方法,提供了開放構造步驟,最后調用toString0方法就可以獲得一個構造好的完整字符串。其就是一個建造者模式的體現。

角色

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

1.產品(Product)

要創建的產品類對象。

2.建造者抽象(Builder)

建造者的抽象類,規范產品對象的各個組成部分的建造,一般由子類實現具體的建造過程。

3.建造者(ConcreteBuilder)

具體的Builder類,根據不同的業務邏輯,具體化對象的各個組成部分的創建。

4.調用者(Director)

調用具體的建造者,來創建對象的各個部分,在指導者中不涉及具體產品的信息,只負責保正對象各部分完整創建或按某種順序創建。

優缺點

優點:

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

原文鏈接:https://blog.csdn.net/qq_38628046/article/details/126087259

欄目分類
最近更新