パターンは、最善の手順と良い設計を記述するための手段です。 パターンは、一般的なプログラム上の課題に柔軟な解決策を提供します。
Factory パターンにより、実行時にオブジェクトを初期化できるようになります。 オブジェクトを"製造する"ことに似ているため、これは Factory パターンと呼ばれています。 パラメータ化された Factory が、生成するクラス名を引数として受け取ります。
例 19-25. パラメータ化された Factory メソッド
<?php
class
Example
{
// パラメータ化された Factory メソッド
public
static function
factory
(
$type
)
{
if (include_once
'Drivers/'
.
$type
.
'.php'
) {
$classname
=
'Driver_'
.
$type
;
return new
$classname
;
} else {
throw
new
Exception
(
'Driver not found'
);
}
}
}
?>
|
このメソドをクラス内で定義することで、実行時に ロードされるドライバを作成できるようになります。
Example
クラスが、データベース抽象化クラスで、
MySQL
および
SQLite
ドライバをロードするとすると以下のように行うことができます。
<?php
// MySQL ドライバをロード
$mysql
=
Example
::
factory
(
'MySQL'
);
// SQLite ドライバをロード
$sqlite
=
Example
::
factory
(
'SQLite'
);
?>
|
|
Singleton パターンは、クラスのインスタンスが一つだけであることが 必要である場合に適用されます。 この最も一般的な例は、データベースへの接続です。 このパターンを実装することで、プログラマは この単一のインスタンスが他の多くのオブジェクトから容易に アクセスできるようにすることができます。
例 19-26. Singleton 関数
<?php
class
Example
{
// クラスのインスタンスを保持する
private
static
$instance
;
// private なコンストラクタ。オブジェクトが直接生成されるのを防ぐ
private
function
__construct
()
{
echo
'I am constructed'
;
}
// singleton メソッド
public
static function
singleton
()
{
if (!isset(
self
::
$instance
)) {
$c
=
__CLASS__
;
self
::
$instance
= new
$c
;
}
return
self
::
$instance
;
}
// とあるメソッド
public
function
bark
()
{
echo
'Woof!'
;
}
// ユーザーがインターフェースを複製するのを防ぐ
public
function
__clone
()
{
trigger_error
(
'Clone is not allowed.'
,
E_USER_ERROR
);
}
}
?>
|
このコードにより、
Example
クラスのインスタンスが一つ 作られ、取得されます。
<?php
// コンストラクタが private であるため、これは失敗します
$test
= new
Example
;
// これにより、クラスの単一のインスタンスを取得します。
$test
=
Example
::
singleton
();
$test
->
bark
();
// これにより、E_USER_ERROR が発生する
$test_clone
=
clone $test
;
?>
|
|