ソフトウェアのデザインパターン再入門 - ログ3

ソフトウェアのデザインパターンを読み進めている。

今回はBuilderパターンの理解を進めた。書籍のP107を開くと以下のクラス図が載っている。

./images/figure_01.jpg

これの理解を深めるために簡単なコードをC#で書いた。文字列をコンソール画面に出すのみだ。このデザインパターンを深堀するならConcreteBuilder1, ConcreteBuilder2, ConcreteBuilder3といったクラス構成にしたほうがいいのかもしれない。

ただ、今日は致し方ない。ニュースによれば都心では最高気温36度を超えたとある。それだけ暑ければ思考が深くならなくても致し方がない。別の機会に試みることにしたい。

話を戻す。ひとまずシンプルな構成で試した。

  • Program.cs
  • Director.cs
  • IBuilder.cs
  • ConcreteBuilder.cs

Directorクラスのインスタンスを生成する際にIBuilderを実装したConcreteBuilderをコンストラクタの引数に渡す点が1点目のポイントで、DirectorはIBuilderのインターフェースに従ってConstructメソッドを実装しているのが2点目のポイントだ。

Program.cs

1
2
3
4
5
6
using Builder;

var builder = new ConcreteBuilder();
var director = new Director(builder);
director.Construct();
Console.WriteLine(builder.Result);

Director.cs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Builder
{
    public class Director
    {
        private IBuilder builder;

        public Director(IBuilder builder)
        {
            this.builder = builder;
        }

        public void Construct()
        {
            this.builder.BuildPartA();
            this.builder.BuildPartB();
            this.builder.BuildPartC();
        }
    }
}

IBuilder.cs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Builder
{
    public interface IBuilder
    {
        public void BuildPartA();
        public void BuildPartB();
        public void BuildPartC();
    }
}

ConcreteBuilder.cs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Builder
{
    public class ConcreteBuilder : IBuilder
    {
        public string Result { get; private set; } = string.Empty;

        public void BuildPartA()
        {
            this.Result += "BuildPartA\n";
        }

        public void BuildPartB()
        {
            this.Result += "BuildPartB\n";
        }

        public void BuildPartC()
        {
            this.Result += "BuildPartC\n";
        }
    }
}

それにしても今日は本当に暑い。基本的に家の中に篭っていた。買い物は日中を避けたが暑かった。6月がこんなに暑いことあっただろうか。昼はとりあえず素麺を食べた。そしてとりあえず水回りの掃除をした。あと子どもの壊れた消防車を直した。これは大きい。長男はとても喜んでいた。すぐ壊しそうである。

さて、明日以降も暑いらしい。外に出たくない。