やる夫がデザインパターンをやるようです 第7回
____ /⌒ ⌒\ ホジホジ /( ●) (●)\ /::::::⌒(__人__)⌒::::: \ ファクトリパターンて | mj |ー'´ |全然イミフだお \ 〈__ノ / ノ ノ ____ /⌒ ⌒\ どう見てもインスタンスの生成を . /( ●) (●)\ 押付けてるだけだお / ::::::⌒(__人__)⌒::::: \イミフてか意味ないお | |r┬-| | \ `ー'´ / ノ \ /´ ヽ カ | l l||l 从人 l||l l||l 从人 l||l カ タ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. タ ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐ ,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄ ____ _ _ _ _ _ _ _ _ _ _ _ /_ノ ヽ、_\ ( 最近やたら先輩風吹かしたがる . / (● ) (● )\ ( アーキテクトにきいてみるか。。 ///////(__人__)///\ ◯ | | 。O  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄  ̄ \ / ノ \ /´ ヽ | l \ ヽ -一'''''' ファクトリパターンの意味がわからないお おいらがわかったって言うまでいろんな角度から説明してほしいお / ̄ ̄\ ___ / / \ /⌒ ⌒\ | ( ○)(○) プニ (● ) (● ) \ . | (__人_(ニ~`ヽ、 /:::⌒(__人__)⌒::::: \ | ` ⌒´(((_⊂>ヽ| |r┬-| | . | } \ \ `ー'´ / . ヽ } ゝ-| ヽ ヽ ノ \ ヽ \ / ̄ ̄\ ___ / / \ /⌒ ⌒\ | ( ○)(○) (○ ) (○ ) \ フヒ? . | (__人_(ニ~`ヽ、 /:::⌒(__人__)⌒::::: \ | ` ⌒´(((_⊂>ヽ| |r┬-| | . | } \ \ `ー'´ / . ヽ } ゝ-| ヽ ヽ ノ \ ヽ \
Product myInst = fctryInst.createPrdct( "Hoge" );こんな風に教わったりしたことはありませんでしたか?ワタシもかつてはやる夫のようにこのファクトリ(メソッド)パターンの意味が全くわかりませんでした。
// ファクトリを使うこと。 // Product myInst = new HogeProduct(); Product myInst = fctryInst.createPrdct( "Hoge" );new でそのまま実装した次の日、CVSからソースをチェックアウトすると先輩にしっかり上記のようにコメントをもらったことがあります。上記の createPrdct メソッドの中身を見てみると、パラメータをもらって、適宜 Product クラスを返すというものなのですが、以下にサンプルソースを載せてみます。
Product createPrdct( String param )
{
if( param.equals( "Hoge" ) ){
return new HogeProduct();
}
else if( param.equals( "Moge" ) ){
return new MogeProduct();
}
else if( param.equals( "Fuga" ) ){
return new FugaProduct();
}
return null;
}
上記のようにcreatePrdctメソッドはProductクラスを継承したHogeProductや、MogeProduct、FugaProductをもらったパラメータを頼りに返すというものです。これを見たとき、ワタシが思ったのは「こんなのインスタンスの生成を押付けてるだけじゃんか。なにが嬉しいの?」でした。発想がやる夫とあまり変わりません。フヒヒ。
/ ̄ ̄\ ( ;;;;( / _ノ ヽ\ ) ;;;;) | ( ○) (○)/;;/ . | (__人__) l;;, | ∩ ノ)━・'/ . | / ノ´ } . ヽ / / } (こいつに何を教えてもザルだからな。。。) ヽ/ / ノ 工場萌えみたいなもんだ。ハヤリだハヤリ。 あきらかに相手にされてないお。。。 おいらみたいなスーパーハカーはなかなか理解されないもんだお こんな会社やめてやるお :::::::: :: :: ::::: :: ::: :::::: :: ____ ::::: :::: ::: :::::: :::: / ::: \ ::: ::: :: :::: ::::/ :: \:: ::: :: :::: /::: ─ ─ \ :: :: ::: | :: .(○) (○) | : :::: ::: \ (__人__) ,/ : ::: :: ノ ` ⌒´ \ : ::: /´ ヽ ::: | l \::: ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) / ̄ ̄\ この新人の扱いはアメよかムチだな。。。JK / \ |:::::: | . |::::::::::: | |:::::::::::::: | ....,:::´, . . |:::::::::::::: } ....:::,, .. . ヽ:::::::::::::: } ,):::::::ノ . ヽ:::::::::: ノ (:::::ソ: . /:::::::::::: く ,ふ´.. -―――――|:::::::::::::::: \ -―,――ノ::ノ―― |:::::::::::::::|ヽ、二⌒)━~~'´ ____ とりあえずGoogleに聞いてみるお。 /⌒ ⌒\ 会社辞めるのはそれからだお。 . /( ●) (●)\ / ::::::⌒(__人__)⌒::::: \ | |r┬-| | \ `ー'´ / ノ \ /´ ヽ カ | l l||l 从人 l||l l||l 从人 l||l カ タ ヽ -一''''''"~~``'ー--、 -一'''''''ー-、. タ ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒)) ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐ ,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄ オブジェクト生成 使用の分離 意思決定 先送り 委譲 カプセル化 一元化 ____ /::::::─三三─\ わ、わざと難しい日本語つかってるに /:::::::: ( ○)三(○)\ 違いないお。さっぱりだお。 |::::::::::::::::::::(__人__):::: | ________ \::::::::: |r┬-| / | | | ノ:::::::::::: `ー'´ \ | | | こんな会社もう思い残すものはないお。。。 ___ /::::::::::::::::\ /:::::─三三─\ /:::::::::(○)三(○).\ /⌒)⌒)⌒.:::::::::: (__人__) :::::: \ /⌒)⌒)⌒) | / / /.. ` ⌒´ | (⌒)/ / / /,,-''ヽ、 | :::::::::::(⌒) / ゝ ::::::.,,-''" \ | ノ \ /_,-'" \ ヽ / ヽ /\ \ | | __ //\\ \ /|[]::::::|_ / \/\\ / ./| ̄ ̄ ̄ ̄ //\ \/ \ // ___ | |:::「「「「「「 / \/\ /\\ /:::/ ./| _..| |:::LLLLL//\ \/ \/\\/::::::/ / | ロ .|l / llllll| |:::「「「「 / \/\ /\ .\/ ./::::::::/ / ./ . __ llllll| |:::LLL.//\ \/ \/\ /::::::::/ | / .| ロ | |:::「./ .\/\ /\ \/ /::::::::/⌒ヽ、| ||/ ..| | |:::l//\ \/ \/\_, -― 、 ''"⌒ヽ,_ (⌒ヽ、_,ノ⌒Y" Y .....⌒) (⌒ヽー゙ ....::( ..::....... .__人.....:::::::: / ̄ ̄\ ( ;;;;( / _ノ ヽ\ ) ;;;;) | ( ○) (○)/;;/ . | (__人__) l;;, | ∩ ノ)━・'/ . | / ノ´ } なんか不穏なこと考えてそうな顔してやがる . ヽ / / } ヽ/ / ノ やる夫。インスタンスの生成を押付けてるのはそのとおりだ。 常識的に考えて、仕事ができるやつに仕事をさせるだろう。 もっと言うと、お前が信用できんからお前はインスタンスの生成はするな ということだ。 ファクトリが返すインスタンスが本当はなにもんかも知らなくていい。 / ̄ ̄\ / _ノ \ | ( ●)(●) . | (__人__) | ` ⌒´ノ . | } . ヽ } ヽ ノ / く | \ | |ヽ、二⌒) ___ / ⌒ ⌒\(もっと言い方選んでほしいお) / (○) (○) \ / ///(__人__)/// \ | u. `Y⌒y'´ | \ ゙ー ′ ,/ /⌒ヽ ー‐ ィヽ / rー'ゝ 〆ヽ /,ノヾ ,> ヾ_ノ,| | ヽ〆 |´ |
ちなみにファクトリは、シンプルファクトリ、ファクトリメソッド、アブストラクトファクトリとパターンがいくつかあります。次のポストはそこらへんをもう少し突っ込んで書きたいと思います。
≪第6回・ 第8回≫

