10周年のSPコンテンツ!
4
あえとす 9/16 和光市ボドゲ会 @aetos382
後回しにしていた Factory 系パターンについて調べた。 忘れなきゃうちにメモしてから寝よう。
あえとす 9/16 和光市ボドゲ会 @aetos382
今なら言える。これは Factory Method パターンじゃない。 qiita.com/shoheiyokoyama…
あえとす 9/16 和光市ボドゲ会 @aetos382
いやなんというか。 「パターンなんて頑なに守るものではないし、『っぽさ』が感じ取れればいい」と言っておきながら「これは Factory Method パターンじゃないからダメ」とかね。我ながら何言ってんだって思ったので言い訳しておこうと思うけれども。
あえとす 9/16 和光市ボドゲ会 @aetos382
まずね、GoFの23のパターンの中には、Factory MethodパターンとAbstract Factoryパターンがある。あと、23のパターンに含まれないんだけど、FactoryパターンとかSimple Factoryパターンというらしいのを一緒に紹介しているサイトもある。
あえとす 9/16 和光市ボドゲ会 @aetos382
厳密に言えば、ここで挙げた 3 つの Factory 系パターンのどれにも当てはまらない、Factory っぽいパターン(たとえばデリゲートを使う:GoF 本はデリゲートがある言語を前提としてないからね)っていうのもあり得るし、書いてきたし、そんなに悪いパターンでもないわけ。
あえとす 9/16 和光市ボドゲ会 @aetos382
で、実際、それなりにプログラムを書く上では、その「Factory っぽさ」が理解できていれば、抽象的なプログラムは書ける。それが GoF に照らして何パターンっていうのか知らなくても、何となく「Factory」っていう言葉は通じる。お仕事をする上ではそれでいいの。
あえとす 9/16 和光市ボドゲ会 @aetos382
まぁ余談だけれども、デリゲートを使うパターンは、パターン自体を抽象的に考えれば、Abstract Factory パターンに属するものだとは思う。
あえとす 9/16 和光市ボドゲ会 @aetos382
では何がダメかっていうと、「これが GoF の Factory Method パターンだ」って言っておいて、そうじゃないものを紹介している。これはダメでしょう。端的に間違いだ。
あえとす 9/16 和光市ボドゲ会 @aetos382
では、先の例のどこが Factory Method パターンではないのか、というと。Factory Method ってのは Template Method の派生であって、Template Method でオーバーライドされるメソッドが Factory になっているものを言う。
あえとす 9/16 和光市ボドゲ会 @aetos382
うん、えっと。ごめんね。こっちは Factory Method になってる。 qiita.com/shoheiyokoyama…
あえとす 9/16 和光市ボドゲ会 @aetos382
ただ、一応あってる方も、Factory Method としてはわかりにくい例になってるとは思う。 Factory Method では、その名の通り、Method が Factory であるんであって、Factory オブジェクトではないんですよ。
あえとす 9/16 和光市ボドゲ会 @aetos382
このコードを見ると、create メソッドが返したオブジェクトを使っているのは main なんですよ。そうすると AccountFactory が「Factory オブジェクト」っぽく見えてくる。 qiita.com/shoheiyokoyama…
あえとす 9/16 和光市ボドゲ会 @aetos382
でもFactory Methodには「Factoryオブジェクト」っていう登場人物はいないんです。だから、ここで言うCreatorオブジェクト(この名前がアレなんだけど)が、外部にオブジェクトを提供するんではなくて、自身で使うオブジェクトをサブクラスに作らせる方が、それっぽい
あえとす 9/16 和光市ボドゲ会 @aetos382
なんだけど、Creator は Product の作成処理の一部をサブクラスに移譲しているから、よく見ると Factory Method ではある。んだけど、それっぽくはない。と思う。
あえとす 9/16 和光市ボドゲ会 @aetos382
あと、一緒に紹介されることが多い、GoF 外の「Factory パターン」とか「Simple Factory パターン」と呼ばれるもの。これは Factory Method とは違って、クライアントが外部の Factory オブジェクトにオブジェクトの作成を依頼するパターン。
あえとす 9/16 和光市ボドゲ会 @aetos382
これは Abstract Factory と対比して Concrete Factory と呼んだ方がいいかもしれない。クライアントが Factory の具体的な型を知っていて、Factory は抽象的ではなくて、内部にどの型を生成するかを決める if 文を持っているものを言う。
あえとす 9/16 和光市ボドゲ会 @aetos382
それを抽象化したものが Abstract Factory パターン。クライアントは Factory の実際の型を知らない。Factory の実装は内部に型を決める分岐を持たない。
あえとす 9/16 和光市ボドゲ会 @aetos382
なので、Factoryって名前が付くからと言ってFactory MethodとAbstract Factoryを並べるのは良くなくて、Factory MethodはTemplate Method、Simple FactoryはAbstract Factoryと対比するのが良い。
あえとす 9/16 和光市ボドゲ会 @aetos382
あと、もうひとつ、看過できない過ちがあるんだけど。 Abstract Factory は「関連する複数のオブジェクトを生成するためのパターン」っていう説明ね。これはダメでしょう。
あえとす 9/16 和光市ボドゲ会 @aetos382
Factory が生成するオブジェクトが1つであっても、クライアントが Factory の具体的な型を知らないならば、それは Abstract Factory ですよ。
あえとす 9/16 和光市ボドゲ会 @aetos382
ところで DDD の「ファクトリ」って、ここまで長々と言ってきた GoF の Factory 系パターンのどれとも素直には対応しないのよね。それこそまさに「Factory っぽいオブジェクト」なんだよね。
あえとす 9/16 和光市ボドゲ会 @aetos382
Factory Method も Abstract Factory も具体的な実装をある程度規定するパターン名だけど、DDD で言う「ファクトリ」はもっと抽象的な意味。抽象的ってのは「っぽい」ってこと。それをどうやって実装するかっていう時に使うのが GoF パターン、よね。
あえとす 9/16 和光市ボドゲ会 @aetos382
いや「忘れないうちにメモしておこう」くらいのつもりだったのが、思いのほか筆が乗って……また3時になってしまった……寝よう。
残りを読む(35)

コメント

あえとす 11/10 田町ボドゲ会 @aetos382 2017年11月16日
Factory系パターンはGoFのデザインパターンの中でもメジャーな部類なのに、一番難しかったです。
ログインして広告を非表示にする
ログインして広告を非表示にする