なんとなく、振り返ってみようかなと思って、今日の気分でObject Creationalのパターンだけ。仕事では主にJavaで自社のEC系のWebサービスを開発してる。ので、Frameworkを作ったりしてないし、Desktopアプリとかスマホアプリとかは作ってない。WebAppエンジニアの視点から。
デザインパターンについての参考:
http://www.techscore.com/tech/DesignPattern/index.html/
Object Creational: Abstract Factory
目的
関連・依存するオブジェクトのファミリーを生成するためのインターフェイスを提供する。
感想
Factoryのインターフェイスを定義して入れ替え可能にするってパターンだけど、僕は使うときないなー。複数のファミリーに対応するってときがないから。んで、だから、それらの生成をまとめる必要もなくて。なので、そういうオブジェクト群を生成するようなFactoryも作るときがないような気がする。
Object Creational: Builder
目的
複雑なオブジェクトの生成と表現を分離して、同じ生成方法で違う表現を生成することができるようにする。
感想
パターンとしてはBuilderのインターフェイスを定義して、それをDirectorに渡して使うからBuilderを差し替えられるって感じよね。これもAbstract Factoryと同じ理由で、差し替えたいってときがないので、自分で作って使うことはないかなー。
ただ、Spring FrameworkのResponseEntityとかUriComponentsBuilderとかは内部で実装を入れ替えたりしてるかもなぁって思うので、知らず知らずに使ってるとは思う。
あと、もし作るならBuilderのインターフェイスを定義するより、Builderの具象クラスを作ってその内部で使ってるクラスを入れ替える、って作り方をするかもなぁ。と思った。
Builer自体は結構好き。特にDTOの生成だったらLombokの@Builderを使うことが多い。その方が、コンストラクターだけで全部受け取ったり、コンストラクターで生成したあとにsetterでセットするのより好き。
Object Creational: Factory Method
目的
オブジェクトを生成するためのインターフェイスを定義して、サブクラスがどのクラスをインスタンス化するかを决められるようにする。
感想
インターフェイスは使わないなぁ。Factoryは、staticメソッドとしてそのクラス自体に定義してしまうことが多い。生成対象が継承を使ってる場合も、僕はFrameworkを開発する側じゃなくて、その上で動くアプリを作る側なので、あんまり汎用的に作る必要がないので、親側のクラスやインターフェイスに生成用のstaticメソッドを作ってどのインスタンスを生成するかもそいつが決めてしまうことが多いかな。
Object Creational: Prototype
目的
プロトタイプインスタンスを使ってオブジェクトの種類を指定して、それをコピーすることで新しいオブジェクトを作る。
感想
使わないかなぁ。まず、cloneを使わないし。必要ならコピーするメソッドを自分で作るだろうな。だし、もし内容が最初から決まってるんだったら、それを生成するためのファクトリー的なメソッドとかファクトリー的なクラスを作るかな。それに、値オブジェクトを使う場合は、コピーする必要もないしね。
Object Creational: Singleton
目的
1つだけインスタンスが存在することを保証して、グローバルにそのインスタンスにアクセスできるようにする。
感想
使わない。テスト書きにくくなるから。Singletonオブジェクトを作るんじゃなくて、Springの@ComponentでSingletonスコープにする。
まとめ
こんな感じか
- Abstract Factory: 使わない。
- Builder: インターフェイスを切り替えたりするところまでは自分では作らないけど、Springが使ってそう。それを僕は利用してそう。
- Factory Method: インターフェイスは使わない。
- Prototype: 使わない。値オブジェクトを使う。
- Singleton: 使わない。Singleton ScopeのComponentを使う。
気づき
あんまり使ってなかった。「インターフェイスで汎用的に」ってのを感じるけど、僕はあんまり汎用的に作る必要がないから、その部分は僕にとっては不要なんだろうなって思った。ただ、インターフェイスは作らないけど、ファクトリークラスや、ファクトリーメソッド、ビルダークラスはよく作るし好きだよ。という感じ。面白かった。