« 2008年05月04日 - 2008年05月10日 | メイン | 2008年05月18日 - 2008年05月24日 »



2008年05月11日 - 2008年05月17日 アーカイブ

2008年05月12日

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

≪第13回第15回≫

テンプレートメソッドのまとめです。
テンプレートメソッドは、処理内でアルゴリズムの骨組みを定義し、いくつかの手順をサブクラスに先送りします。また、アルゴリズムの構造を変えることなくその手順をサブクラスに再定義させます。
テンプレートメソッドは上記のような定義で歌われています。骨子となるアルゴリズムはfinal定義され、サブクラスでオーバーライドできないようにして、「変更」に対しては硬直させ、「拡張」するような処理はサブクラスでオーバーライドすることで柔軟に対応できるようになっています。
ストラテジーパターンと比較すると、テンプレートメソッドは、「継承」を使ってアルゴリズムのカプセル化を行い、ストラテジーパターンはコンポジションを使ってカプセル化を行います。コンポジションというのは、オブジェクトで振舞いを構成することを指します。ストラテジーパターンそのものですね。
     ____
   /      \    テンプレートメソッドは
  /  ─    ─\   簡単でわかりやすかったお。
/    (●)  (●) \
|       (__人__)    |
/     ∩ノ ⊃  /
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ / 







         ___
       / ⌒  ⌒\   気に食わないメソッドを継承して
      / (●)  (●) \ オーバーライドしておいらの実力を
    /   ///(__人__)/// \ 見せ付けてやるお
     |   u.   `Y⌒y'´    |
      \       ゙ー ′  ,/
      /⌒ヽ   ー‐    ィヽ
      / rー'ゝ       〆ヽ
    /,ノヾ ,>      ヾ_ノ,|
    | ヽ〆        |´ | 








   / ̄ ̄\     (どっからそんな発想が湧いてくんだ)
 /   _ノ  \   てめぇにもとっとと後輩つけて
 |    ( ●)(●)  まるっとオーバーライドしてもらいてぇもんだな
. |     (__人__) 
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \ 
    |    |ヽ、二⌒)








             ____ 
           /      \
          / ─    ─ \   いや、普通にそれはないわ
        /   (●)  (●)  \
        |      (__人__)     |
         \     ` ⌒´    ,/
 r、     r、/          ヘ
 ヽヾ 三 |:l1             ヽ
  \>ヽ/ |` }            | |
   ヘ lノ `'ソ             | |
    /´  /             |. |
    \. ィ                |  |
        |                |  | 







   / ̄ ̄\
 /   _ノ  \   いや、どこもない話じゃないんだが、
 |    ( ●)(●) てめぇに自信を持つのはかまわん。
. |     (__人__) そんなスーパーハカーのやる夫に聞くが
  |     ` ⌒´ノ  今回のテンプレートメソッド。こいつをみたのは
.  |         }  初めてじゃないはずだ。
.  ヽ        }
   ヽ     ノ
   /    く
   |     \ 
    |    |ヽ、二⌒)









     ____
    / ⌒  ⌒  \    そうだお。スーパーハカーだから
  ./( ―) ( ●)  \  初めてじゃないお。
  /::⌒(_人_)⌒:::::  |
  |    ー       .|
  \          / 









   / ̄ ̄\
 /   _ノ  \    そうだな。じゃぁ
 |    ( ●)(●) どこでこいつを見たか話してみろ
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \ 
    |    |ヽ、二⌒)











          ____
       / ノ  \\   そんなプライベートなことまで
      / (●)  (●)\ 問いただされるのは
    / ∪  (__人__)  \ さすがの俺もひくわ
    |      ` ⌒´    |
     \ /⌒)⌒)⌒)   //⌒)⌒)⌒)
    ノ  | / / /   (⌒) / / / /
  /´    | :::::::::::(⌒)  ゝ  :::::::::::/
 |    l  |     ノ  /  )  /
 ヽ    ヽ_ヽ    /'   /    /
  ヽ __     /   /   / 
       ____











   / ̄ ̄\  ( ;;;;(   (このキュンポは
 / _ノ  ヽ\ ) ;;;;)   いったいどういう勘違いしてやがんだ?)
 |  ( ○) (○)/;;/   いやいや。
. |   (__人__) l;;,      おめぇの性癖を語れとはいってねぇんだが?
  |    ∩ ノ)━・'/   
.  |   /  ノ´ } 
.  ヽ  / /    } 
   ヽ/ /   ノ 











        ノ L____
       ⌒ \ / \   そんなこと言っても
      / (○) (○)\ ブラウザの履歴は見せられないお!!
     /    (__人__)   \
     |       |::::::|     |
     \       l;;;;;;l    /l!| !
     /     `ー'    \ |i
   /          ヽ !l ヽi
   (   丶- 、       しE |そ  ドンッ!!
    `ー、_ノ       ∑ l、E ノ <
               レY^V^ヽl 









        / ̄ ̄\
      /       \ (あーこいつの勘違いは神憑ってるわ)
      |::::::        | もういい。俺が悪かった。
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´ 









        ノ L____
       ⌒ \ / \   
      / (○) (○)\ googleの検索履歴も見せられないお!!
     /    (__人__)   \
     |       |::::::|     |
     \       l;;;;;;l    /l!| !
     /     `ー'    \ |i
   /          ヽ !l ヽi
   (   丶- 、       しE |そ  ドンッ!!
    `ー、_ノ       ∑ l、E ノ <
               レY^V^ヽl 
テンプレートメソッドをインスタンスの生成で特化したものがファクトリーメソッドです。ソースを見れば一目瞭然なのですが、
// ゲーム製作会社スーパークラス
abstract class GameCompany {
    public Game orderGame( String name ){
        // サブクラスに作成するゲームを決定させる
        Game gameInst = createGame( name );

        gameInst.prepare();
        gameInst.produce();
        gameInst.checkProduct();
        gameInst.package();
        return gameInst;
    }
    
    // ファクトリオブジェクトから受け取ったcreateGameメソッド
    abstract Game createGame( String name );
}
createGameメソッドはサブクラスで生成処理を拡張しています。orderGameはfinal指定されていませんが、この手順のアルゴリズムを変えることはありませんので処理がカプセル化されていますね。
と、このようにテンプレートメソッドはいろいろなシーンで出て来ると思います。継承を使った拡張なのでオブジェクト指向を学び始める方にも分かりやすい内容ではないでしょうか。

≪第13回第15回≫


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


[ スポンサードリンク ]

2008年05月15日

ExtJSをfirebugでデバッグする便利な方法

firebugonextjs01.PNG
firebugonextjs02.PNG
firebugonextjs03.PNG
firebugonextjs04.PNG
firebugonextjs05.PNG
firebugonextjs06.PNG
firebugonextjs07.PNG
firebugonextjs08.PNG
firebugonextjs09.PNG
firebugonextjs10.PNG
firebugonextjs11.PNG
これまでにExtJSの使い方を何度かポストしていて、日本語のチュートリアルがあることもポストしましたが、チュートリアルのほとんどは英語で書かれています。ので、しっかりと読むには腰をすえなければならず、ちょこちょことtipsなんかを斜め読みしていたのですが、このページにExtJSの作りこみやデバッグを飛躍的に向上させる方法が載っていました。

javascriptのデバッグというとFireFoxプラグインのfirebugを思い浮かべます。そのとおり上記チュートリアルもfirebugを使ったデバッグです。もちろんこのブログで紹介しているExtJS関連のポストもfirebugを使ってデバッグしてはいますが、あまり使い込んでおらず適宜ブレークポイントを置いて変数なんかをウォッチする程度のものでした。知らなかったのはコンソールにスクリプトを直接書いて実行させることが出来るってことです。え・・・それって常識・・・とかドン引きされることかと思いますが、コンソールにスクリプトを直接書いて実行出来るらしいですよ!(同じことを2度言ってみました)(恥ずかしい子!)

恥ずかしい子はどうでもよいのですが、上記ページのチュートリアルを引用してキャプチャをいくつか追加しながらポストしたいと思います。
ココまで読んでいる方なら以下の資材はお持ちかと思いますが一応リンクしておきます。 firefoxをインストールしてfirebugを入れたらfirefoxでExt2.1-API Dcumentationを開きます。なぜこのページを開くのかと言いますと理由は単純でExtJSが全てロードされているためです。
開きましたら図のようにfirebugを立ち上げます。
ツール>Firebug>Open Firebugで開きます。
次にEnable FirebugをクリックしてこのExt2.1-API Dcumentationページをデバッグできる状態にします。
さらにConsoleタブをクリックして、コンソールを開きます。右ペインの複数行入力できるコンソールが開いていなければ右下のアイコンをクリックしてペインを開きます。
開いたらこのコンソールに以下のコードを入力し、RunをクリックするかCTRL+ENTERを押下します。
Ext.get(document.body).update('<div id="test"></div>');
このコードはページのdocument.bodyを取得し、そのinnerHTMLをdiv id="test"で更新すると言うものです。HTMLタブをクリックしてbodyノードを開くとinnerHTMLが<div id="test"></div>になっていることが確認できます。同時に画面からコンテンツが消えます。コンテンツは消えますが、ExtJSのライブラリはロードされたままですので、コイツを利用してスクリプトのテストが行えるんです。

ためしに、
new Ext.Panel({
    renderTo: 'test',
    width: '200px',
    title: 'My Title',
    html: 'My HTML content'
});
をコンソールにコピペ(追記)してCTRL+ENTERを押下します。すると、Ext.Panelが表示されます!
    renderTo: 'test',
というコンフィグオプションでdiv id="test"をレンダリング先としていますので、1行目は消さないでください。続けて、html: 'My HTML content'というコンフィグオプションの直後に
    ,collapsible : Boolean
を挿入してみます。地味ですが、パネルのタイトルバー右に[▲]アイコンが表示され、パネルのボディが開いたり閉じたり出来るようになりました!ということはAPI DocumentationにあるExtクラスのメソッドや、コンフィグなどがリアルタイムにどんなものなのか確認できるようになったということですね。うわーすげー便利だ。

では次にrenderTo: 'test',と言う箇所を// でコメントアウトします。
    //renderTo: 'test',
画面からパネルが消えますので,collapsible : Booleanの直後に以下のコードを挿入します。
    ,x: 100
    ,y: 100
    ,renderTo: Ext.getBody()
    ,floating: true
    ,frame: true
    ,height: 200
    ,draggable: {
        insertProxy: false,
        onDrag : function(e){
            var pel = this.proxy.getEl();
            this.x = pel.getLeft(true);
            this.y = pel.getTop(true);
            var s = this.panel.getEl().shadow;
            if (s) {
               s.realign(this.x, this.y, pel.getWidth(), pel.getHeight());
            }
        },
        endDrag : function(e){
            this.panel.setPosition(this.x, this.y);
        }
    }
すると、パネルがドラッグ&ドロップできるようになりました!
というわけで、日本語チュートリアルと全然変わりありませんが知ってるのと知らないのでは大違いなのでポストしてみました。何が一番びっくりしたのかと言いますと、このコンソールの使い方がgetfirebug.comにデカデカと載っていたことです。あーびっくりした。(しらじらしい)

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


2008年05月13日

Ext.DataViewの使い方

simpledataview.PNG ExtJSのエントリはこちらにまとめてあります

ダウンロードページより、アーカイブ(Ext JS 2.1 SDK)をダウンロードして解凍してください。20080513時点のバージョンは ext-2.1 です。解凍したら、以下のパスのファイルを開いて見ましょう。
【パス】
ext-2.1\examples\view\data-view.html
開いてみると、何も見えませんね。これはサーバサイトスクリプトを参照しに行っていてその参照先がローカルのget-images.phpにあるためです。ですので直接ExtJSのDataViewサンプルを見てみます。
このウィジェットがDataViewと呼ばれるものです。サンプルではサムネイル画像がならんでいて、マウスをドラッグするか、CTRLまたはSHIFTキーを押しながら選択すると複数のアイテムが選択できるようになっています。今日はこのDataViewの基本的な実装を解説してみたいと思います。あと、いきなりDataViewとか言われても・・と言う方にはここにExtJSのチュートリアルを簡単にまとめてみました。
まず、以下に今回解説するDataViewのソースを全て載せてみましたので、この実装方法とコンフィグを解説します。
動作サンプルとサンプルソース
Ext.onReady( function(){
    var lookup = {};

    var siteData = [
        ['http://mojalog.com','http://capture.heartrails.com/small?http://mojalog.com','mojalog'],
        ['http://google.co.jp','http://capture.heartrails.com/small?http://google.co.jp','google'],
        ['http://yahoo.co.jp','http://capture.heartrails.com/small?http://yahoo.co.jp','yahoo'],
        ['http://extjs.com','http://capture.heartrails.com/small?http://extjs.com','extjs'],
        ['http://capture.heartrails.com','http://capture.heartrails.com/small?http://capture.heartrails.com','heartrails' ],
        ['http://youtube.com','http://capture.heartrails.com/small?http://youtube.com','youtube' ]
    ];

    var store = new Ext.data.SimpleStore({
        fields: [
           { name: 'siteurl'},
           { name: 'imgurl' },
           { name: 'name'   }
        ],
        data : siteData
    });

    var formatData = function(data){
        lookup[data.name] = data;
        return data;
    };

    var view = new Ext.DataView({
        tpl: new Ext.XTemplate(
            '<tpl for=".">',
                '<div class="thumb-wrap" id="{name}">',
                '<div class="thumb"><img src="{imgurl}" title="{name}"></div>',
                '<span>{name}</span>',
                '</div>',
            '</tpl>'
        ),
        singleSelect: true,
        overClass:'x-view-over',
        itemSelector: 'div.thumb-wrap',
        store: store,
        listeners: {
            'dblclick':{
                fn:function(){
                    var selNode = view.getSelectedNodes()[0];
                    var data = lookup[selNode.id];
                    location.href=data.siteurl;
                }
            }
        },
        prepareData: formatData.createDelegate( this )
    });

    var panel = new Ext.Panel({
        id: 'img-chooser-view',
        title: 'DataView',
        renderTo: 'container',
        width:320,
        autoScroll: true,
        items:view,
        collapsible:true
    });
});

【Ext.DataViewの解説】

それではDataViewを見ていきたいと思います。
    var view = new Ext.DataView({
という箇所がデータビューそのものになります。前回のgridと同様にstoreというデータストアを保持していてこのstoreの内容がデータの実体になります。
DataViewのコンフィグオプションで必須となるのはitemSelectorと言うもののようです。
itemSelector : String
This is a required setting. A simple CSS selector (e.g. div.some-class or span:first-child) that will be used to determine what nodes this DataView will be working with.
とあり、これはDataViewがどのノードで動いているかを決定するために使われる、CSSセレクタというものらしいです。今回は値に'div.thumb-wrap'を持たせてあります。このノードを「データビューのデータとして扱います」ということになるんだと思います。
ちなみにdiv.thumb-wrapは、次のtplというコンフィグオプションで定義します。

tplは、以下のように定義してあります。

        tpl: new Ext.XTemplate(
            '<tpl for=".">',
                '<div class="thumb-wrap" id="{name}">',
                '<div class="thumb"><img src="{imgurl}" title="{name}"></div>',
                '<span>{name}</span>',
                '</div>',
            '</tpl>'
        ),
このtplはExt.XTemplateを使ってテンプレートとして用いているのですが、このXTemplateが非常に強力で、tplノードのアトリビュートを使って演算を行い、実データをオートフィリングしてくれます。上記ではforという演算式を用いて、store内の複数データをスコープ内のタグに埋めていくようになっていますが、if演算式や内臓テンプレート変数、インラインコードの実行なんかも出来るようです。使いこなせればデータのデータのフィルタなんかも出来そうですね。XTemplateのAPIDocを貼っておきます。
上記は、{}で括られた name / imgurl をforで展開しています。このnameとimgurlはstoreのfieldsで定義した名前です。
DataViewの基本的なコンフィグオプションはこのくらいで、後はオプションみたいなものです。

overClassはマウスオーバー時のclassを値として持たせています。singleSelectはアイテムを複数選択状態に出来ないようにするものです。これに対してmultiSelectと言うものがあり、このコンフィグオプションを使用してtrueにしておくと、CTRLやSHIFTを押しながら複数選択することが出来ます。
    overClass:'x-view-over',
    singleSelect: true,
'x-view-over'はスタイルシート内に定義していて、マウスオーバーしたときに表示が変わると言うものです。無くてもいいと思います。

最後にlistenersとprepareDataを解説します。
    listeners: {
        'dblclick':{
            fn:function(){
                var selNode = view.getSelectedNodes()[0];
                var data = lookup[selNode.id];
                location.href=data.siteurl;
            }
        }
    },
    prepareData: formatData.createDelegate( this )
listenersはイベントリスナーのことです。今回はダブルクリックした際のイベントを拾って画面遷移を行っています。DataViewのgetSelectedNodes()で選択されたノードを返しますので、その先頭を拾ってstoreに格納したデータのsiteurlを解決しています。
prepareDataはメソッドなのですが、ロード時にキックされてデータの準備を行うもののようです。今回はformatDataメソッドにその処理を委譲していてlookupオブジェクトに、各データを突っ込んでいっています。lookupオブジェクトは、選択されたデータを探すために利用しています。
    var selNode = view.getSelectedNodes()[0];
    var data = lookup[selNode.id];
この2行はまず、DataViewで選択されたノードを取り出します。次に、selNode.idをlookupの連想配列のkeyとして指定して、該当のデータを特定します。これで、data.siteurlとか、data.nameとか、data.imgurlで参照が出来るようになっています。
selNode.idのidは前述のテンプレート定義の中の
    '<div class="thumb-wrap" id="{name}">',
にあるように、ノードのidを指しているのですが、この値はstoreのfieldsの{name}が置かれています。
ロード時に、prepareDataで委譲したformatDataメソッドが呼ばれてlookupオブジェクトのkeyであるdata.nameに対してdataがドカドカと格納されていきます。
    var formatData = function(data){
        lookup[data.name] = data;
        return data;
    };
これでlookupのkeyはnameで解決できると言うことです。(firebugで分かりました。)

というわけで、DataViewの解説をしてみました。ワタシの理解を多分に含めておりますので、誤った情報である可能性がありますのでご注意ください。

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


2008年05月12日

カラダのギミックが仕上がりました!

DSCF2352.jpg 靴も履かして身体もつくりました。うまくいった(゚∀゚)ノシ
あとは顔を作ってスーツを着せるんです。

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


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

≪第13回第15回≫

テンプレートメソッドのまとめです。
テンプレートメソッドは、処理内でアルゴリズムの骨組みを定義し、いくつかの手順をサブクラスに先送りします。また、アルゴリズムの構造を変えることなくその手順をサブクラスに再定義させます。
テンプレートメソッドは上記のような定義で歌われています。骨子となるアルゴリズムはfinal定義され、サブクラスでオーバーライドできないようにして、「変更」に対しては硬直させ、「拡張」するような処理はサブクラスでオーバーライドすることで柔軟に対応できるようになっています。
ストラテジーパターンと比較すると、テンプレートメソッドは、「継承」を使ってアルゴリズムのカプセル化を行い、ストラテジーパターンはコンポジションを使ってカプセル化を行います。コンポジションというのは、オブジェクトで振舞いを構成することを指します。ストラテジーパターンそのものですね。
     ____
   /      \    テンプレートメソッドは
  /  ─    ─\   簡単でわかりやすかったお。
/    (●)  (●) \
|       (__人__)    |
/     ∩ノ ⊃  /
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ / 







         ___
       / ⌒  ⌒\   気に食わないメソッドを継承して
      / (●)  (●) \ オーバーライドしておいらの実力を
    /   ///(__人__)/// \ 見せ付けてやるお
     |   u.   `Y⌒y'´    |
      \       ゙ー ′  ,/
      /⌒ヽ   ー‐    ィヽ
      / rー'ゝ       〆ヽ
    /,ノヾ ,>      ヾ_ノ,|
    | ヽ〆        |´ | 








   / ̄ ̄\     (どっからそんな発想が湧いてくんだ)
 /   _ノ  \   てめぇにもとっとと後輩つけて
 |    ( ●)(●)  まるっとオーバーライドしてもらいてぇもんだな
. |     (__人__) 
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \ 
    |    |ヽ、二⌒)








             ____ 
           /      \
          / ─    ─ \   いや、普通にそれはないわ
        /   (●)  (●)  \
        |      (__人__)     |
         \     ` ⌒´    ,/
 r、     r、/          ヘ
 ヽヾ 三 |:l1             ヽ
  \>ヽ/ |` }            | |
   ヘ lノ `'ソ             | |
    /´  /             |. |
    \. ィ                |  |
        |                |  | 







   / ̄ ̄\
 /   _ノ  \   いや、どこもない話じゃないんだが、
 |    ( ●)(●) てめぇに自信を持つのはかまわん。
. |     (__人__) そんなスーパーハカーのやる夫に聞くが
  |     ` ⌒´ノ  今回のテンプレートメソッド。こいつをみたのは
.  |         }  初めてじゃないはずだ。
.  ヽ        }
   ヽ     ノ
   /    く
   |     \ 
    |    |ヽ、二⌒)









     ____
    / ⌒  ⌒  \    そうだお。スーパーハカーだから
  ./( ―) ( ●)  \  初めてじゃないお。
  /::⌒(_人_)⌒:::::  |
  |    ー       .|
  \          / 









   / ̄ ̄\
 /   _ノ  \    そうだな。じゃぁ
 |    ( ●)(●) どこでこいつを見たか話してみろ
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \ 
    |    |ヽ、二⌒)











          ____
       / ノ  \\   そんなプライベートなことまで
      / (●)  (●)\ 問いただされるのは
    / ∪  (__人__)  \ さすがの俺もひくわ
    |      ` ⌒´    |
     \ /⌒)⌒)⌒)   //⌒)⌒)⌒)
    ノ  | / / /   (⌒) / / / /
  /´    | :::::::::::(⌒)  ゝ  :::::::::::/
 |    l  |     ノ  /  )  /
 ヽ    ヽ_ヽ    /'   /    /
  ヽ __     /   /   / 
       ____











   / ̄ ̄\  ( ;;;;(   (このキュンポは
 / _ノ  ヽ\ ) ;;;;)   いったいどういう勘違いしてやがんだ?)
 |  ( ○) (○)/;;/   いやいや。
. |   (__人__) l;;,      おめぇの性癖を語れとはいってねぇんだが?
  |    ∩ ノ)━・'/   
.  |   /  ノ´ } 
.  ヽ  / /    } 
   ヽ/ /   ノ 











        ノ L____
       ⌒ \ / \   そんなこと言っても
      / (○) (○)\ ブラウザの履歴は見せられないお!!
     /    (__人__)   \
     |       |::::::|     |
     \       l;;;;;;l    /l!| !
     /     `ー'    \ |i
   /          ヽ !l ヽi
   (   丶- 、       しE |そ  ドンッ!!
    `ー、_ノ       ∑ l、E ノ <
               レY^V^ヽl 









        / ̄ ̄\
      /       \ (あーこいつの勘違いは神憑ってるわ)
      |::::::        | もういい。俺が悪かった。
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´ 









        ノ L____
       ⌒ \ / \   
      / (○) (○)\ googleの検索履歴も見せられないお!!
     /    (__人__)   \
     |       |::::::|     |
     \       l;;;;;;l    /l!| !
     /     `ー'    \ |i
   /          ヽ !l ヽi
   (   丶- 、       しE |そ  ドンッ!!
    `ー、_ノ       ∑ l、E ノ <
               レY^V^ヽl 
テンプレートメソッドをインスタンスの生成で特化したものがファクトリーメソッドです。ソースを見れば一目瞭然なのですが、
// ゲーム製作会社スーパークラス
abstract class GameCompany {
    public Game orderGame( String name ){
        // サブクラスに作成するゲームを決定させる
        Game gameInst = createGame( name );

        gameInst.prepare();
        gameInst.produce();
        gameInst.checkProduct();
        gameInst.package();
        return gameInst;
    }
    
    // ファクトリオブジェクトから受け取ったcreateGameメソッド
    abstract Game createGame( String name );
}
createGameメソッドはサブクラスで生成処理を拡張しています。orderGameはfinal指定されていませんが、この手順のアルゴリズムを変えることはありませんので処理がカプセル化されていますね。
と、このようにテンプレートメソッドはいろいろなシーンで出て来ると思います。継承を使った拡張なのでオブジェクト指向を学び始める方にも分かりやすい内容ではないでしょうか。

≪第13回第15回≫


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


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

open all | close all

リファラから検索


サイト内検索