首頁 > 軟體

Java中常用的設計模式之建造者模式詳解

2022-02-27 19:00:22

優點

1.建造者獨立,易擴充套件。

2.便於控制細節風險。

缺點

1.產品必須有共同點,範圍有限制。

2.如內部變化複雜,會有很多的建造類。

使用場景

1.需要生成的物件具有複雜的內部結構。

2.需要生成的物件內部屬性本身相互依賴。

一、實現方式

package com.asurplus.common.builder.style1;
public class UserInfo {
    private String name;
    private int age;
    /**
     * 建立一個新的建造者
     *
     * @return
     */
    public static UserInfoBuilder builder() {
        return new UserInfoBuilder();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
	@Override
    public String toString() {
        return "UserInfo{" +
                "name='" + name +
                ", age=" + age +
                '}';
    }
    /**
     * 建造者內部類
     */
    public static class UserInfoBuilder {
        private String name;
        private int age;
        public UserInfoBuilder name(String name) {
            this.name = name;
            return this;
        }
        public UserInfoBuilder age(int age) {
            this.age = age;
            return this;
        }
        /**
         * 建立一個新的範例物件並賦值
         *
         * @return
         */
        public UserInfo build() {
            UserInfo userInfo = new UserInfo();
            userInfo.setName(this.name);
            userInfo.setAge(this.age);
            return userInfo;
        }
    }
}

我們定義了一個 UserInfo 類,有 name,age 兩個屬性,還定義了一個靜態內部類 UserInfoBuilder,幫助我們建造 UserInfo,並提供鏈式呼叫的方法。

二、實現方式

1、引入依賴

<!-- lombok外掛 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

Lombok 需要在 IDEA 中安裝外掛,具體方法,請百度。

2、實現

package com.asurplus.common.builder.style2;
import lombok.Builder;
import lombok.Data;
/**
 * get set toString 方法註解
 */
@Data
/**
 * 建造者模式註解
 */
@Builder
public class UserInfo2 {
    private String name;
    private int age;
}

基於 Lombok 的註解,我們省略了大部分程式碼,但是具體的實現方式和我們的方式一是一模一樣的,呼叫方法也是一樣的。

三、測試

package com.asurplus.common.builder;
import com.asurplus.common.builder.style1.UserInfo;
import com.asurplus.common.builder.style2.UserInfo2;
/**
 * 建造者模式
 */
public class TestMain {
    public static void main(String[] args) {
        // 手寫的方式
        UserInfo userInfo = UserInfo.builder().name("張三").age(20).build();
        System.out.println(userInfo);
        // 註解的方式
        UserInfo2 userInfo2 = UserInfo2.builder().name("李四").age(30).build();
        System.out.println(userInfo2);
    }
}

輸出結果

總結

本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!   


IT145.com E-mail:sddin#qq.com