はじめに
デザインパターンを理解するための記事。
まず、関連のあるUMLの説明に入る。
UMLとは?
ソフトウェア設計を視覚化するために、
ソフトウェアの構造や振舞いを記述する時に用いられる言語。
ソフトウェアプログラムを構成するクラスやオブジェクト、
アクティビティ(プログラムの動作)などの要素を図で表現し、
それらの関係や処理の流れを記号で定義している。
ダイアグラム例
UML図は、システムの静的な構造を描写する構造図と、
システムの振る舞いを描写する振る舞い図に分けられる。
構造図には、クラス図やコンポーネント図などがある。
振る舞い図には、アクティビティ図やシーケンス図などがある。
いくつかあるUML図の内のクラス図を例として挙げる。
クラス図
クラスの構造やクラス間の関係を表す静的な構造図である。
・クラス構造を表す図
© 2007 Trashtoy
各区画は上からクラス名(Article)、属性(プロパティ)、操作(メソッド)が記述されている。
下線はクラスに定義されたものを表している。
各行は先頭からアクセス修飾子(+はpbluc、-はprivate)、名前、引数や戻り値を示す。
・クラス関係を表す図
集約と呼ばれるクラス図で、ProfessorクラスがClassクラスを所有している、
あるいはClassクラスはProfessorクラスの一部であるなどの主従関係を示す。
デザインパターンとは?
プログラム開発の際に、頻繁に利用する設計アイデアをUMLや文章でまとめ、
それに名前を付けて再利用できるようにしたもの。
アイデアとは?:
クラスライブラリやフレームワークなどの具体的なコードではなく、
プログラム設計において発生する問題に対する解決方法のこと。
有名なデザインパターンは書籍1で紹介された23のパターン
アイデアをデザインパターンにした例
シングルトンパターン
クラスからインスタンスを作成する際のデザインパターン。
1つのクラスから生成されるインスタンスを1つだけに限定するためのもの。
目的
メモリリークの防止
リソースの共有
クラス図
シングルトンパターンの一般的なクラス図。
クラス図の解説は以下である。
・同じ型のインスタンスが private なクラス変数として定義されている。
・コンストラクタの可視性が private である。
・同じ型のインスタンスを返す getInstance() がクラス関数として定義されている。
クラス図内にあるアンダーラインは、その項目がクラス変数あるいはクラス関数であることを意味している。
出典:wikipedia
サンプルコード
class Singleton
{
private static $instance;
private function __construct()
{
}
public static function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
//クラス外からインスタンス生成できないためエラー
$CreateInstance = new singleton();
/*インスタンスが1つしか存在しないことを確認するため、
2つの変数にインスタンスを格納する*/
$singleton1 = Singleton::getInstance();
$singleton2 = Singleton::getInstance();
//変数の値を比較して確認する
echo $singleton1 === $singleton2 ? 'true' : 'false'; //-> true
-
Design Patterns: Elements of Reusable Object-Oriented Software ↩