« SharePointのフォームを自前で作ってみよう。UpdateListItemsの使い方 | メイン | やる夫がデザインパターンをやるようです 第8回 »



やる夫がデザインパターンをやるようです 第7回

やる夫がデザインパターンをやるようです 第7回をはてなブックマークに追加 やる夫がデザインパターンをやるようです 第7回をdel.icio.usに追加  Yahoo!ブックマークに登録 やる夫がデザインパターンをやるようです 第7回をGoogle Bookmarksに追加 やる夫がデザインパターンをやるようです 第7回をtwitterにポスト
≪第6回第8回≫

       ____
     /⌒  ⌒\ ホジホジ
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \ ファクトリパターンて
  |    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ー'ゝ       〆ヽ
    /,ノヾ ,>      ヾ_ノ,|
    | ヽ〆        |´ | 
ファクトリはインスタンスの生成をカプセル化するものです。カプセル化しておくと何が嬉しいのかというと、ストラテジーパターンでもやったように、インスタンス生成の変更があった場合、これを一元的に管理することができます。やる夫のようにいろんなところにnewをちりばめてしまうと、newをgrepして修正する羽目にもなりかねません。ちなみにストラテジーパターンで使うビヘイビアをファクトリで返してあげることがよくあります。

ちなみにファクトリは、シンプルファクトリ、ファクトリメソッド、アブストラクトファクトリとパターンがいくつかあります。次のポストはそこらへんをもう少し突っ込んで書きたいと思います。
≪第6回第8回≫

★このコンテンツに目的の情報はありませんでしたか?


[ 最近のエントリーとその関連エントリー ]


[ スポンサードリンク ]

トラックバック

このエントリーのトラックバックURL:
http://mojalog.com/cgi/mt/mt-tb.cgi/260

コメントを投稿

ツリータイプ・カテゴリー

open all | close all

リファラから検索


サイト内検索