Time Flies

fckey's Tech Blog

デザインパターンが実際に使用される例と意識するべき事とか

デザインパターン

使ったなら何か特別なモノが出来そうな気がしてくる響きである。

とある仕様の物質演舞~デザインパターン~などと書いてみるとこの世の物理法則すら超越できそうな気もしてくる。

ではデザインパターンを用いれば必ず素晴らしいソフトウェアが出来るのだろうか?

もちろんそうではない。

ソフトウェアの設計を行う上でオブジェクトの関係、再利用、メッセージングなどを考える中で自然と利用される形式。気付いたら頻繁に構築されているオブジェクトの利用方法。結果的に出来上がる構成。デザインパターンとは本来そういったものである。

センス溢れる人ならデザインパターンは学ぶまでもなく自然と構築出来るのだろう。だが、筆者を含め皆が皆オブジェクト指向の申し子とは限らない。プログラミングの幅を広げ引き出しを増やすという意味でもオブジェクト指向に慣れていない人にはデザインパターンを学ぶことを強く勧める。

以下では筆者が学生時代に記述したアプリケーション*1を用いてデザインパターンの実用例を紹介する。コードの一部切り取りでコンテキストが掴みづらいため、今回はデザインパターンは実際に利用機会があるのだと感じられたら充分だ。

紹介するコードはストリーム型Publish/Subscribeシステムの動作イメージをProcessingを用いて描画したものである。github上のプロジェクト

f:id:fckey:20140216014900p:plain

作成したPub/Subシステムのデモ実行時の画像

  • Factory Method

Node生成用のインターフェースを定義した上で処理用ノードか、センサーノードかで生成方法を変更している

public interface NodeFactory {
    
    Node create(Location loc);
    
    Node create(Id id, Location loc);
}

public class ProcessingNodeFactory implements NodeFactory{
    private static  PApplet core;
    private static  IdFactory idFactory;
    
    public ProcessingNodeFactory(PApplet core, IdFactory idFactory) {
        this.core = core;
        this.idFactory = idFactory;
    }
    
    public  Node create(Location loc){
        return create(idFactory.create(loc), loc);
    }
    
    public Node create(Id id, Location loc){
        return new ProcessingNode(core, id, loc);
    }
    
}

public class SensorFactory implements NodeFactory {

    private static  PApplet core;
    private static  IdFactory idFactory;
    public SensorFactory(PApplet core, IdFactory idFactory) {
        this.core = core;
        this.idFactory = idFactory;
    }
    
    public  Node create(Location loc){
        return create(idFactory.create(loc), loc);
    }
    
    public Node create(Id id, Location loc){
        return new SensorNode(core, id, loc);
    }

}
  • Proxy

再利用可能な未使用のデータオブジェクトがある場合はそれを描画し、ない場合には新たにデータオブジェクトを生成する。

if(dataStockList.isEmpty()){
    data = dataFactory.create(srcNode, dstNode);
    dataUsingList.add(data);
}else{
   data = getIdleData();
   data.init(srcNode.getId(), dstNode.getId(), srcNode.getLocation(), dstNode.getLocation(), Math.random() % Const.MAXDATAVALUE);
}
return data;

この他にもこのデモアプリケーションを作成するために意識しているだけでも以下のパターンが使用されている。

冒頭にも述べたが、デザインパターンはあくまでも手段であり目的を達成する上で結果的に構築されるものである。だが、武器は多いほうが戦いやすいように、デザインパターンを知ることでゴールに辿り着くための近道を見つけられる可能性が何倍にも増す...と筆者は信じている。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

*1:筆者が始めて書いたJavaコードであり、当初はかなりひどかったためリファレンスされている