KICK THE DP

KICK THE CAN CREWでデザインパターンを攻略するブログ

Ch.10 KICK THE STRATEGY

【目標】

Strategyパターンを使って、KICK THE CAN CREWの脳内VACATIONを覗いてみよう。

【クラス図】

f:id:mikeera2:20160923222019p:plain

【実装】

<VacationStyleインターフェース:Strategy>

f:id:mikeera2:20160923222623p:plain

≪KrevaStyleクラス:ConcreteStrategy≫

f:id:mikeera2:20160923222900p:plain

≪McuStyleクラス:ConcreteStrategy≫

f:id:mikeera2:20160923223320p:plain

≪LittleStyleクラス:ConcreteStrategy≫

f:id:mikeera2:20160923223433p:plain

≪Vacationクラス:Context≫

f:id:mikeera2:20160923223652p:plain

[Mainクラス]

f:id:mikeera2:20160923223822p:plain

【出力結果】

f:id:mikeera2:20160923223931p:plain

【メモ】

・すごく使いたくなるネーミング

・Mainクラスからインターフェースを直接扱うのではなく、Context役を通じて操作しているが、この例ではメリットがない

・ConcreteStrategy内のメソッドを複数組み合わせたものをひとつのメソッドとして、Context内で再定義するのであればContextが必要になりそう。

Ch.9 KICK THE BRIDGE

【目標】

Bridgeパターンを使って、ラッパーは歌ったってイーゼてなことを証明しよう。

【クラス図】

f:id:mikeera2:20160923172829p:plain

【実装】

<HumanBase抽象クラス:Abstraction>(機能側の最上位のクラス)

f:id:mikeera2:20160923180608p:plain

≪Rapperクラス:RefinedAbstraction≫(機能を追加した機能側の下位のクラス)

f:id:mikeera2:20160923180832p:plain

<HumanImplインターフェース:Implementor>(実装側の最上位クラス)

f:id:mikeera2:20160923181327p:plain

≪ConcreteHumanクラス:ConcreteImplementor≫(実際のふるまいを定義した実装側の下位クラス)

f:id:mikeera2:20160923181704p:plain

[Mainクラス]

f:id:mikeera2:20160923181753p:plain

【出力結果】

f:id:mikeera2:20160923181852p:plain

【メモ】

・各クラスの関係性がイメージしづらい

・ひとつの「もの」を2つのクラスに分ける感覚がつかみづらい

・TECHSCOREのサイトの説明のが分かりやすいが、実装側のメソッドにアクセスできるようにするというイメージだとAdapterパターンとも混同しそう

・この例が不適切なのはHumanImplインターフェースを実装するのがConcreteHumanクラス以外に考えにくいところだ。これならばRapperクラスをConcreteHumanクラスから継承させるだけで目標が達成できる。TECHSCOREの例のように、SortインターフェースをQuickSortクラスとBubbleSortクラスに実装させるというような例を考えるべきだ。

Ch.8 KICK THE ABSTRACT FACTORY

【目標】

Abstract Factoryパターンを使って、「BREAK3」をやってみよう

【クラス図】

f:id:mikeera2:20160908182754p:plain

【実装】

 <AbstractRapper抽象クラス:AbstractFactory

f:id:mikeera2:20160922213558p:plain

 <Track抽象クラス:AbstractProduct>

f:id:mikeera2:20160922214758p:plain

 <Lyric抽象クラス:AbstractProduct>

f:id:mikeera2:20160922213914p:plain

Mcuクラス:CocreteFactory≫

f:id:mikeera2:20160922214426p:plain

≪McuTrackクラス:ConcreteProduct≫

f:id:mikeera2:20160922214921p:plain

≪McuLyricクラス:ConcreteProduct≫

f:id:mikeera2:20160922215214p:plain

≪Littleクラス:ConcreteFactory≫

~略~

≪LittleTrackクラス:ConcreteProduct≫

~略~

≪LittleLyricクラス:ConcreteProduct≫

~略~

Krevaクラス:CocreteFactory≫

~略~

≪KrevaTrackクラス:ConcreteProduct≫

~略~

≪KrevaLyricクラス:ConcreteProduct≫

~略~

[Mainクラス]

f:id:mikeera2:20160922215350p:plain

 【出力結果】

f:id:mikeera2:20160922215438p:plain

【メモ】

・これまで以上に例が不適切に感じる。

・具体的に使える場面がわかりそうでわからんない。

・AbstractRapperクラス内のクラス名を指定してインスタンスを生成する方法は覚えておきたい。

Ch.7 KICK THE BUILDER

【目標】

Builderパターンを使って、「もしもリトルが〇〇だったら」をやってみよう

【クラス図】

f:id:mikeera2:20160907180850p:plain

【シーケンス図】

f:id:mikeera2:20160907180915p:plain

【実装】

<Little抽象クラス:Builder>

f:id:mikeera2:20160922181635p:plain

≪Moshimoクラス:Director≫

f:id:mikeera2:20160922181943p:plain

≪Manクラス:ConcreteBuilder≫

f:id:mikeera2:20160922182242p:plain

≪Indianクラス:ConcreteBuilder≫

f:id:mikeera2:20160922182521p:plain

≪Rapperクラス:ConcreteBuilder≫

f:id:mikeera2:20160922182720p:plain

[Mainクラス:Client]

f:id:mikeera2:20160922182831p:plain

【出力結果】

f:id:mikeera2:20160922182913p:plain

【メモ】

・お題に無理がある。おもしろいけど。

・Director役のMoshimoインスタンスがBuilder役のLittleが何を実装しているかを知らない(知る必要がない)ことがポイント!

Ch.6 KICK THE PROTOTYPE

【目標】

Prototypeパターンを使って、Sayonara Sayonaraのバックトラックからいろんなバージョンを作ろう

【クラス図】

f:id:mikeera2:20160906184719p:plain

【実装】

≪SayonaraSayonaraクラス:Prototype≫

f:id:mikeera2:20160922174620p:plain

f:id:mikeera2:20160922174641p:plain

[Mainクラス:Client]

f:id:mikeera2:20160922175010p:plain

f:id:mikeera2:20160922175020p:plain

【出力結果】

f:id:mikeera2:20160922175112p:plain

【メモ】

・public object Clone() { return MemberwiseClone(); }は定型文のように覚えていいのだろうか?

JavaのCloneableインターフェースと違い、C#のICloneableインターフェースは必ずClone()メソッドの実装が必要なようだ

Ch.5 KICK THE SINGLETON

【目標】

Singletonパターンを使って本当に最高はひとつじゃないのか検証しよう

【クラス図】

f:id:mikeera2:20160905174913p:plain

【実装】

≪Singletonクラス:Singleton≫

f:id:mikeera2:20160922170838p:plain

[Mainクラス]

f:id:mikeera2:20160922170929p:plain

【出力結果】

f:id:mikeera2:20160922171015p:plain

【メモ】

・使用機会は限りなくありそうなので積極的に使っていこう

Ch.4 KICK THE FACTORY METHOD

【目標】

Factory Methodパターンを使って、ヒップホップとR&Bの曲を作ろう

【クラス図】

f:id:mikeera2:20160905170611p:plain

【実装】

<Song抽象クラス:Product>

f:id:mikeera2:20160921223115p:plain

<Project抽象クラス:Creator>

f:id:mikeera2:20160921223523p:plain

f:id:mikeera2:20160921223525p:plain

≪HipHopSongクラス:ConcreteProduct≫

f:id:mikeera2:20160921223811p:plain

≪HioHopProjectクラス:ConcreteCreator≫

f:id:mikeera2:20160921224140p:plain

f:id:mikeera2:20160921224149p:plain

≪RAndBSongクラス:ConcreteProduct≫

 f:id:mikeera2:20160921224355p:plain

≪RAndBProjectクラス≫

f:id:mikeera2:20160921224746p:plain

f:id:mikeera2:20160921224756p:plain

[Mainクラス]

f:id:mikeera2:20160921224912p:plain

【出力結果】

f:id:mikeera2:20160921224954p:plain

【メモ】

・こっちではprotectedを使っているのは何故だ

・これも結城センセのソースに則って、名前空間フレームワーク側と実装側に分けているが、必ずしも必要ではない気がする

・Factory Methodパターンつってんのに、なぜFactoryではなくCreatorなのか

・コンストラクタの中にCreate()の役目を実装してしまうのは避けた方がよいのだろう。コンストラクタでは基本的には代入のみを行うようにする。