0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ラーメンをBuilderパターンで作る

0
Posted at

ことの始まり

某系ラーメン店の「ニンニク入れますか」で要求されている引数の型はbooleanではなくstringのarrayなんだよな、という発言をSNSで見て「そんな時こそBuilderパターンなのでは?」と思ったのでラーメン(の注文)をBuilderパターンで作ってみようと思って作るのである。

ただし私が某系ラーメンに詳しくないので、代わりに一蘭のオーダー用紙を例に実装してみます。

商標・特許に関する注意事項

  • 「一蘭」「ICHIRAN」は株式会社一蘭の登録商標です
  • 「オーダー用紙」は株式会社一蘭の特許「味集中カウンター」の構成要素の一部です
  • 本記事の著者は株式会社一蘭とは何ら関係がありません
  • 本記事の目的はプログラミング学習であり、この記事の内容を学習以外で利用し発生した係争については、著者は一切責任を負いません

オーダーの仕様

実店舗に行って元祖オーダー用紙の仕様を確認してきました。
ついでに(?)実食してきました。
仕様は下記の通りです。

項目 選択肢
味の濃さ うす味・基本・こい味
こってり度 なし・あっさり・基本・こってり・超こってり
にんにく なし・少々・基本・1/2片分・1片分
ねぎ なし・白ねぎ・青ねぎ
チャーシュー なし・あり
赤い秘伝のたれ なし・1/2倍・基本・2倍~10倍
麺のかたさ 超かた・かため・基本・やわめ・超やわ

太字の選択肢は一蘭によるおすすめです。

enumの作成

まずは見本として味の濃さ(用紙での英語表記はDashi)のenumを作りましょう。
toString()をオーバーライドして、デモが行いやすいようにしておきます。

Dashi.java
package jp.rainyvillage.cibmc.example;

public enum Dashi {
    LIGHT("うす味"),
    MEDIUM("基本"),
    STRONG("こい味");

    private String description;
    private Dashi (String description) {
        this.description = description;
    }
    public String toString() {
        return "味の濃さ:" + this.description;
    }
}

その他のオーダー項目についても同様にenumを作成します。

Orderクラスとそのビルダーの作成

Builderパターンの特性として記述が冗長になってしまいますがここはやむを得ないところです。
Orderクラスでも先ほどと同様にtoString()をオーバーライドしておきましょう。
Orderクラスのgetter/setterは省略しています。
Builderでのデフォルト値は一蘭のおすすめにしています。

Order.java
package jp.rainyvillage.cibmc.example;

public class Order {
    private Dashi dashi;
    private Richness richness;
    private Garlic garlic;
    private GreenOnion greenOnion;
    private Chashu chashu;
    private OriginalSpicyRedSauce originalSpicyRedSauce;
    private NoodleTexture noodleTexture;

    private Order(OrderBuilder builder) {
        this.dashi = builder.dashi;
        this.richness = builder.richness;
        this.garlic = builder.garlic;
        this.greenOnion = builder.greenOnion;
        this.chashu = builder.chashu;
        this.originalSpicyRedSauce = builder.originalSpicyRedSauce;
        this.noodleTexture = builder.noodleTexture;
    }

    public String toString() {
        String[] arr = {
            this.dashi.toString(),
            this.richness.toString(),
            this.garlic.toString(),
            this.greenOnion.toString(),
            this.chashu.toString(),
            this.originalSpicyRedSauce.toString(),
            this.noodleTexture.toString()
        };
        return String.join(",", arr);
    }

    public static class OrderBuilder {
        private Dashi dashi;
        private Richness richness;
        private Garlic garlic;
        private GreenOnion greenOnion;
        private Chashu chashu;
        private OriginalSpicyRedSauce originalSpicyRedSauce;
        private NoodleTexture noodleTexture;

        OrderBuilder() {
            this.dashi = Dashi.MEDIUM;
            this.richness = Richness.MEDIUM;
            this.garlic = Garlic.MEDIUM;
            this.greenOnion = GreenOnion.GREEN_ONION;
            this.chashu = Chashu.WITH;
            this.originalSpicyRedSauce = OriginalSpicyRedSauce.MILD;
            this.noodleTexture = NoodleTexture.MEDIUM;
        }
        public OrderBuilder setDashi(Dashi param) {
            this.dashi = param;
            return this;
        }
        public OrderBuilder setRichness(Richness param) {
            this.richness = param;
            return this;
        }
        public OrderBuilder setGarlic(Garlic param) {
            this.garlic = param;
            return this;
        }
        public OrderBuilder setGreenOnion(GreenOnion param) {
            this.greenOnion = param;
            return this;
        }
        public OrderBuilder setChashu(Chashu param) {
            this.chashu = param;
            return this;
        }
        public OrderBuilder setOriginalSpicyRedSauce(OriginalSpicyRedSauce param) {
            this.originalSpicyRedSauce = param;
            return this;
        }
        public OrderBuilder setNoodleTexture(NoodleTexture param) {
            this.noodleTexture = param;
            return this;
        }
        public Order build() {
            return new Order(this);
        }
    }

    public static OrderBuilder builder() {
        return new OrderBuilder();
    }
}

実行サンプルコード

Main.java
import jp.rainyvillage.cibmc.example.*;

void main(String[] args){
    // 一蘭のおすすめのオーダー
    Order order1 = Order.builder().build();
    System.out.println("【注文1】" + order1.toString());

    // 超ストイックなオーダー
    Order order2 = Order.builder()
        .setDashi(Dashi.STRONG)
        .setRichness(Richness.EXTRA_RICH)
        .setGarlic(Garlic.ONE_CROVE)
        .setGreenOnion(GreenOnion.WHITE_GREEN_ONION)
        .setChashu(Chashu.WITHOUT)
        .setOriginalSpicyRedSauce(OriginalSpicyRedSauce.X10)
        .setNoodleTexture(NoodleTexture.EXTRA_FIRM)
        .build();
    System.out.println("【注文2】" + order2.toString());
}

サンプルコードの実行

Windows版 OpenJDK 26.0.1 を利用して実行してみます。

PowerShell
javac -d .\out\ -sourcepath .\src\ .\src\Main.java
java -cp .\out Main
実行結果
【注文1】味の濃さ:基本,こってり度:基本,にんにく:基本,ねぎ:青ねぎ,チャーシュー:あり,赤い秘伝のたれ:1/2倍,麺のかたさ:基本
【注文2】味の濃さ:こい味,こってり度:超こってり,にんにく:1片分,ねぎ:白ねぎ,チャーシュー:なし,赤い秘伝のたれ:10倍,麺のかたさ:超かた

おわりに

超ストイックなオーダーについては当方で実食しておりません。
実際に注文する際はご注意ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?