[Java学习笔记] 使用Builder Pattern 使物件初始化有预设参数

什麽是预设参数?

允许函式在没有传入值的情况下,以指定的预设值初始化。

直观方法

  • 建构子多载
public class Person{
    private String name;
    private int age;
    private int gender;
    
    public Person(String name, int age, int gender){
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    
    public Person(int age, int gender){
        this.name = "noName";   // 预设参数
        this.age = age;
        this.gender = gender
    }
}
  • 困境-
    • 当参数型态相同时无法分辨省略了哪个参数, 如范例中的age和 gender
    • 当参数很多的时候,要写很多多型的建构子

简易的 Builder Pattern 概念

透过介面定义一个创建的过程,将物件的建构过程隐藏
* 使用情境: 当传入的物件较为复杂时, 分离创建步骤, 使创建过程更清晰 (请自行搜寻, 本篇不讨论)

public class Person{
    ... 
    public Person(String name, int age, int gender){   
        ...
    }
}
    
public interface Builder{        //以介面分离
    void setName(String name);
    void setAge(int age);
    void setGender(int gender);
    void Person create();
}

public class concreteBuilder implements Builder{
    // 实作介面方法
}

使用Builder Pattern 完成物件初始化

public class Person{
    ... 
    private Person(String name, int age, int gender){   
        // 将建构子存取权限设为私有, 让使用者无法直接创建
        ...
    }
    
    public static class Builder{
        // 透过静态Builder 物件创建物件
        private String name;
        private int age;
        private int gender;
          
        public Builder(){
            // 不需参数即可创建 (使用预设值)
            this.name = "Diane";
            this.age = 18;
            this.gender = 2;
        }
        public Builder setName(String name){
            // 开放方法让使用者可以选择性输入
            this.name = name;
            return this;
        }
        ....
        public Person creat(){
            // 必须透过Builder呼叫才可以创建物件
            retrun new Person(name,age,int);
        }
    }
}
public class Main {
    public static void main(String[] args){
        Person person = new Person.Builder().setName("Tina").create();
        Person person2 = new Person.Builder().create();

        System.out.println(person.getName());    //Tina
        System.out.println(person2.getName());   //Diane
    }
}

<<:  Azure Developer Course

>>:  [Git] Intro

Day8. 使用 Invision 搭建低精度互动原型

今天我们来练习制作一个可互动的 Spotify Sign-in 低精度原型吧! 首先,用昨天教学的...

LeetCode解题 Day22

1239. Maximum Length of a Concatenated String with...

[Day04] 物件型别

物件 Object 除了基本型别其他都可以归类至物件型别 建立一个自定义的物件主要有两种方式,一个是...

虾皮串接实作笔记-串接 API 虾皮物流标签

前言 目标:串接虾皮订单、标签资讯,目前串接虾皮 OpenAPI 2.0 版本,串接手册 串接步骤:...

Day06:06 - User服务(1) - 後端 - 注册、登入、Python正则表达式

Hi,Сәлам,我是Charlie! 在Day05当中我们完成了Django的基本架构跟资料库,今...