最近学んだBuilderパターンと有効な状況を自分なりに整理してみた


Javaの開発に限らずオブジェクト指向プログラミングをするにあたり、
デザインパターンというものを知っていると、詳細設計やコーディング時に非常に重宝する。

デザインパターンの中でも今回はBuilderのデザインパターンについて整理しようと思う。

この記事は基本的なJavaのBuilderパターンの考え方を私なりに説明し、
玄人でなくても即実践投入できるようにがんばります。



Javaに慣れてきたらこれ↓ 

<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B07RHX1K53/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07RHX1K53&linkCode=as2&tag=soepy-22&linkId=89aed8faf68411d6ca7d27273cbdd75c"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B07RHX1K53&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=soepy-22" ></a>



<a href="//af.moshimo.com/af/c/click?a_id=2607720&p_id=2898&pc_id=6652&pl_id=37289&guid=ON" rel="nofollow" referrerpolicy="no-referrer-when-downgrade"><img src="//image.moshimo.com/af-img/0697/000000037289.png" width="568" height="60" style="border:none;"></a><img src="//i.moshimo.com/af/i/impression?a_id=2607720&p_id=2898&pc_id=6652&pl_id=37289" width="1" height="1" style="border:none;">



#はじめに

まず、私は書籍などで勉強したわけではなく、
先輩エンジニアから学んだ内容を自分なりに咀嚼したものなので、
間違いや認識違いがあればコメントを頂けるとありがたい。

#Builderパターンの理解

私の理解としてはBuilderパターンは、**DTO + 処理**のようなイメージでいる。（厳密には異なる）
日本語で説明すると

- コンストラクタで変数をset
- setした値を利用して何かしらの処理をする
- コンストラクタの引数で足りない場合はsetterで補う

というような感じ。

実際のサンプルコードを書いてみる

```java

public class MessageLinkBuilder{

  private String msg;
  private String url;

  /**
   * メッセージのみまずコンストラクタで渡す
   */
  public MessageLinkBuilder(String msg){
    this.msg = msg;
  }

  /**
   * リンクを作る場合はコンストラクタの代わりにurlメソッドで変数を渡す
   */
  public MessageLinkBuilder url(String url){
    if(url != null){
      this.url = url;
    }
    return this;
  }

  /**
   * これを呼べばメッセージがそのまま返る
   */
  public String gesMsg(){
    return this.msg;
  }

  /**
   * これを呼べばメッセージがリンクに変わって返る
   * ただし、urlをsetしていない場合はmsgが返る
   */
  public String getLink(){
    if(this.url != null){
      StringBuilder sb = new StringBuilder();
      sb.append("<a href=\""); 
      sb.append(this.url);
      sb.append("\">");
      sb.append(this.msg);
      sb.append("</a>");
      return sb.toString;
    } else {
      return this.msg;
    }
  }
}

```

Bestな例かはわからないが、上記のようなことを実装できる。（クラス名も微妙かも）
使うときはこんなかんじ↓

```java

 /**
  * メッセージ
  */
 String message = new MessageLinkBuilder("ページはこちら").gesMsg();

 /**
  * リンク
  */
 String link = new MessageLinkBuilder("ページはこちら").url("https://XXXX.YYYY").getLink();


```



#メリット

私が現時点で感じているメリットは以下

- コンストラクタで大量に渡さなきゃいけないが、無駄な引数を送らなきゃいけない時が多いクラスの処理の改善
- コンストラクタの引数が多すぎて順番を間違えたらバグるオブジェクトの修正

#結論

実際のプロダクトコードで有効な場面が上の例のようなパターンでしか遭遇していないので、
メリデメがやり切れていないのだが、
実際にコーディングすると、結構保守性の観点では高そうなので、
有効な状況で積極的に使ってみようと思う。

#参考記事

https://qiita.com/takutotacos/items/33cfda205ab30a43b0b1

<a href="https://hb.afl.rakuten.co.jp/ichiba/1e8530d6.19a113c9.1e8530d7.fe2e9cd6/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15652954%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MSwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/1e8530d6.19a113c9.1e8530d7.fe2e9cd6/?me_id=1213310&item_id=19341995&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F3252%2F9784621303252.jpg%3F_ex%3D240x240&s=240x240&t=pict" border="0" style="margin:2px" alt="" title=""></a>