53ningen.com

@gomi_ningen's Website

Singletonパターンの罠

<p>インスタンスが一個しか存在しないクラスを書くためのパターンがSingleton Patternです.登場するのはSingletonクラスひとつのみで以下のようなクラス図になります.</p> <p><img src="https://static.53ningen.com/wp-content/uploads/2015/12/21012214/L-e1537460534109.png" alt="L" width="188" height="142" class="aligncenter size-full wp-image-64" /></p> <p>結城本には以下のような感じでサンプルコードが掲載されていました.</p>
public class Singleton {
    private Singleton() {}
    private static Singleton singleton = new Singleton();
    public static Singleton getInstance() {
        return singl...
Read More

Iteratorパターンの確認

Iterator パターンはデータの集合体に対して順番に走査する仕組みを作りたいときによく用いられる.たとえば Java では配列やリストなど基本的なデータ構造に Iterator パターンが実装されており,これにより拡張 for 文が実現していたりします.

Iterator パターンの登場人物は主に次の4つになります.

  • 集合体を表す Aggregate インターフェース
  • 走査をしていく Iterator インターフェース
  • ある集合体を表す ConcreteAggregate クラス
  • ある集合体を走査していくための具体的方法を実装した ConcreteIterator クラス

Iterator パターンをある集合体に適用する場合,その集合体を走査するための Iterator を生成して返す iterator メソッドを必ず実装します. Iterator インターフェースは次の要素が存在するかどうかの boolean を返す hasNext(),今の要素を返して次の要素をポイントする next()を持ちます.集合体により走査のしかた,方法などは不定なので,それぞれに...

Read More

Template Method Pattern

だいたいの処理の流れが共通しているとき,それをテンプレートとしてスーパークラスに記述して,個々の具体的処理のみをサブクラスに記述するというパターンがTemplate Method Patternです.

このパターンに登場するクラスは主に2つあります.ひとつは,ひな形となるAbstractClassで,ここにはテンプレート内で行う個々の処理を抽象メソッドです.もうひとつは,それらを使った一連の処理の流れを実装したメソッドです.個々の処理はサブクラスで実装するためにprotectedかpublic修飾子を,それらを使った一連の流れを定義したメソッドは全サブクラスで共通化(テンプレート化)させたいのでfinal修飾子を付けます.クラス図は以下のような具合になります.

<img src="http://53ningen.com/wp-content/uploads/2014/06/L.png" alt="l" width="438" height="166" class="aligncenter size-full wp-image-678" />

実際にファイルになにかを保存するた...

Read More

データ構造:スタックの理解とJavaでの実装

スタックは基本的で重要なデータ構造のひとつ。先頭に対してデータの挿入・削除が行われる順序付きのリストのことを指す。洗い終わった皿を順に上に積み重ねられ、皿が必要なときは一番上から取られていくというようなことを想像していただければそれが、そのままスタックの好例になっている。スタックは後入れ先出し(LIFO:Last In, First Out)や、先入れ後出し(FILO: First In, Last Out)とよばれることもある。

したがってスタックに対しての演算として、次に示す図のように、先頭にデータを挿入するプッシュという操作と、先頭からデータを取り除くポップという操作を定義する必要がある。

この構造を見てみればわかるかもしれませんが、スタックの実装は連結リストの最上位ノード以外を見ることができない状態にしたものと同じになります。また他にもいくつか実装の方法があります。

スタックはどのように使われるのか

2つ...

Read More

連結リストのバリエーション

連結リストには単方向リストだけでなく様々なバリエーションがある。たとえばJavaのLinkedListは双方向リストとして実装されている。その他にも単方向・双方向な循環連結リスト、メモリ効率二重連結リストなどがある。

双方向連結リスト(Doubly-linked list)

単方向リストは次のノードへの参照:nextしかもたなかったが、双方向連結リストは前のノード:prevへの参照も持つ。

循環連結リスト(Circular linked list)

↓ こんなやつ

メモリ効率二重連結リスト(XOR linked list)

☆次の性質を利用して双方向リストを実現している。

X⊕X=0 ...

Read More

Copyright © 53ningen.com