結論から言うとBuilderパターン
メソッドチェインでつないで一行で設定を入れて、実際にほしいクラスを作成します。MQTTnetとかで使うやつです。
今回はただ一秒ごとにカウントアップするカウンタークラスを作成します。
使うときはこんな感じになります。
staticvoidMain(string[]args){varoption=newCounterOptionBuilder().Start(10).Duration(5).End(40).Build();varcountObject=newCounter(option);countObject.Start();}
作成するクラスは以下の3つ
- Counterクラス
- 実際に使いたいクラス
- CounterOptrionsクラス
- Counterクラスに設定する値が入ったクラス
- CounterOptionBuilderクラス
- CounterOptionBuilderクラスをメソッドチェインで作成するクラス
サンプルコード
次は実際にほしいクラスです。
classCounter{privatereadonlyCounterOptionsoption;publicCounter(CounterOptionsoption){this.option=option;}publicvoidStart(){varc=option.start;while(option.end>=c){Console.WriteLine($"counting...{c}");Thread.Sleep(1000);c+=option.duration;}}}
次がBuilderパターンの肝です。
Builderパターンではメソッドは自分を返します。return this;の部分です。
これによってメソッドチェインを実現します。
classCounterOptionBuilder{privatereadonlyCounterOptionsoptions=newCounterOptions();privateintstart;privateintend;privateintduration;publicCounterOptionBuilderStart(intvalue){start=value;returnthis;}publicCounterOptionBuilderEnd(intvalue){end=value;returnthis;}publicCounterOptionBuilderDuration(intvalue){duration=value;returnthis;}publicCounterOptionsBuild(){options.start=start;options.end=end;options.duration=duration;returnoptions;}}
次は設定したい項目をクラス化したものです。Builderパターンでは設定項目をクラスに分離することが多いです。
classCounterOptions{publicintstart{get;set;}publicintduration{get;set;}publicintend{get;set;}}