ホームページ  >  記事  >  バックエンド開発  >  phpデザインパターン(再版)

phpデザインパターン(再版)

WBOY
WBOYオリジナル
2016-07-30 13:30:50942ブラウズ

元のリンク: http://www.cnblogs.com/siqi/archive/2012/09/09/2667562.html

1. シングルトン モード

名前が示すように、モードは 1 つだけです。シングルトンモードの例。 オブジェクト作成モードとして、シングルトン モードは、特定のクラスのインスタンスが 1 つだけ存在することを保証し、自身をインスタンス化し、このインスタンスをシステム全体に提供します。

シングルトン パターンの主なポイントは 3 つあります。

  1. まず、クラスはインスタンスを 1 つだけ持つことができます。
  2. 2 つ目は、このインスタンスを独自に作成する必要があります。このインスタンスをシステム全体に自分で提供する必要があります。
  3. PHPシングルトンモードを使用する理由

1. PHPのアプリケーションは主に

    データベースアプリケーション
  1. にあります。 アプリケーション内で多数のデータベース操作が行われる場合、シングルトン モードを使用すると、リソースを消費する大量の新しい操作を回避でき、データベース接続も減らすことができます。接続が多すぎると発生する可能性が低くなります。 2. システムに特定の構成情報をグローバルに制御する
  2. クラスが必要な場合
  3. 、 これについては、zend Framework の FrontController 部分を参照してください。 3. 1 ページのリクエストで、
  4. デバッグが容易になります
  5. 、 すべてのコード (データベース操作クラス db など) が 1 つのクラスに集中しているため、クラス内にフックを設定してログを出力することで、どこでも var_dump や echo を回避できます。

例:

/**
* デザインパターンのシングルトンモード
* $_instance は静的プライベート変数として宣言する必要があります
* コンストラクターは、新しいクラスからの外部プログラムを防ぐためにプライベートとして宣言する必要があり、これによりシングルトンの意味が失われますモード
* getInstance () メソッドは public に設定する必要があり、インスタンスへの参照を返すにはこのメソッドを呼び出す必要があります
* :: 演算子は静的変数と静的関数にのみアクセスできます
* 新しいオブジェクトはメモリを消費します
*使用シナリオ: 最も一般的に使用される場所はデータベース接続です。
* シングルトン パターンを使用してオブジェクトを生成した後、そのオブジェクトは他の多くのオブジェクトで使用できます。
*/
class man
{
//この属性にインスタンスを保存します private static $_instance;
// コンストラクターはプライベートとして宣言されており、オブジェクトの直接作成を防止する private function __construct()
';
} //

シングルケースメソッド public static function get_instance() (self::$_instance
));
if(!isset(自分: :$ _instance))
return
self ::$ _instance この書き方は、コンストラクターが private として宣言されているため失敗します//$test = new man;//以下は Example クラスの Singleton オブジェクトを取得します
$test
= man::get_instance(); $test = man::get_instance();
$test
->test();// コピーされたオブジェクトは E_USER_ERROR になります。
//$test_clone = clone $test;


2. 単純なファクトリパターン

①抽象基本クラス: サブクラスで実装するために使用されるいくつかの抽象メソッドをクラス内に定義します

②抽象から継承するサブクラスベースクラス: 基本クラスに抽象メソッドを実装します


③ファクトリクラス: 対応するすべてのサブクラスをインスタンス化するために使用されます




/**
* 抽象クラスを定義し、サブクラスに継承させて実装する

class
Operation{
//
抽象メソッド 関数本体を含めることはできません
/* * * 追加クラス getValue($num1,$num2){ +$num2; } } }/**
*トラクションクラス


*/ OperationSub extends
操作{
$num2){
*乗算クラス操作; num1,
$ num2) { {IF num2 == 0) { Throw
New 例外 (「除算を0にすることはできません」);例外
$e
){
} }

オブジェクト指向の継承機能を使用すると、「べき乗」、「平方根」、「対数」、「三角関数」、「統計」などの元のプログラムを簡単に拡張できます。不要なコードをロードしています。

ここで残りのクラスを追加する必要がある場合、それは非常に簡単です

別のクラスを作成し(このクラスは仮想基本クラスを継承します)、クラス内の対応する関数を完了するだけです(例: find電力操作)、および将来のメンテナンスと拡張を促進するカップリングの程度を大幅に削減します。

未解決の問題がまだあります。それは、ユーザーが入力したオペレーターに従ってプログラムに対応するオブジェクトをインスタンス化させる方法です。 解決策: インスタンス化プロセスを実装するには別のクラスを使用します。このクラスはファクトリーです

phpデザインパターン(再版)


/*

*
* 主にオブジェクトの作成に使用されるエンジニアリングクラス * 関数: By による操作シンボルを入力すると、工場は適切なオブジェクトをインスタンス化できます。 Factory::createObj('/');
$result=$test->getValue(23 ,0);
echo $result;

このモードに関するその他の注意事項:

ファクトリーモード:
輸送を例に挙げます:輸送と輸送の生産プロセスの両方をカスタマイズできるようにしてください
1> 輸送をカスタマイズします
1.ハンドオーバー ツール (開始、実行、停止) のメソッドを含むインターフェイスを定義します
2. 航空機、自動車、その他のカテゴリにそれらを実装させます
2> カスタマイズ ファクトリ (上記と同様) 1. 定義配信ツールの製造メソッド (開始、実行、停止) が含まれています
2. このインターフェイスを継承して実装するために、航空機と自動車をそれぞれ製造するためのファクトリ クラスを作成します

元のアドレス: http://bbs.phpchina. com/thread-242243-1-1.html

3. オブザーバー パターン

オブザーバー パターンは、オブジェクト間の 1 対多の依存関係を定義する動作パターンです。変更されると、それに依存するすべてのオブジェクトが通知され、自動的に更新されます。観察者オブジェクトと観察対象物を完全に分離します。プリンシパルに関係する依存関係 (オブザーバー) のリストは、別のオブジェクト (プリンシパル) に保持できます。 すべてのオブザーバーに共通のオブザーバー インターフェイスを個別に実装して、プリンシパル オブジェクトと依存オブジェクト間の直接の依存関係を排除します。 (とにかく理解できない)

使用したspl(標準phpライブラリ)

phpデザインパターン(再版)class MyObserver1

implements SplObserver { public
function update(SplSub)ジェクト $サブジェクト ) {C echo _______
。 '-' $ SUBJECT- & GT; Tionp Update (splsubject $ $ Subject{) $ SUBJECT-> vate $_observers
;

public function __construct($name
) { $this -> _observers = newSpl ObjectStorage();
$this->_name = $name; } public

function
attach(SplObserver $observer ) { $this
-> ;_observers->attach($observer ); }
public function detach(SplObserver $observer
) { $this->_observers->detach($)観察者) ; notify() {
foreach ($this->_observers
as $observer) {
public
function getName() { return $this
- > _name;}}$observer1
=
newmyobserver1();$observer2=newmyobserver2();
$subject->attach($observer1);

$subject->attach($observer2);

$subject

->notify();

参考原文: http://www.php.net/manual/zh/class.splsubject.php

4. 戦略モード

このモードでは、アルゴリズムが複雑なクラスから抽出するため、簡単に置き換えることができます。たとえば、検索エンジンでのページのランク付け方法を変更したい場合は、戦略モードが適しています。検索エンジンの各部分について考える ——1 つのパートはページを横断し、1 つのパートはページごとにソートし、もう 1 つのパートは配置の結果に基づいてソートします。複雑な例では、これらのパーツはすべて同じクラスに属します。 Strategy パターンを使用すると、配置部分を別のクラスに配置して、検索エンジンのコードの残りの部分に影響を与えることなく、ページの配置方法を変更できます。


より簡単な例として、以下に示す User List クラスは、 一連のプラグアンドプレイ ポリシー

に基づいて、一連のユーザー

を検索する方法を提供します。 phpデザインパターン(再版)

//インターフェースを定義するinterface IStrategy {
function filter($record);
}
//インターフェースメソッド1を実装するclass FindAfterStrategy 実装 I戦略 {
プライベート $_name;
public function __construct($name) {
$this->_name = $name;
}
public function フィルター($レコード) {
class RandomStrategy implements IStrategy { public function
filter(
$record
) { return rand (0, 1) >= 0.5; } } //
メインクラスクラスUserList { private
$_list = array ();

public
function __construct($names) { if
($names) != null) { Add ($name
) { $this->_list [] = $name; } public
function find($filter) { ();
foreach ($this->_list as $user) {if
($filter->filter ($user))

[] =
$user
;
} } return $recs; array (
「アンディ」、「ジャック」、「ローリ」、「ミーガン」) );

$f1
= $ ul->find ( new FindAfterStrategy ( "J" ) ) );print_r
( $f1 ); $f2
= $ul->find ( new RandomStrategy ( ) );
print_r ($f2
);
戦略パターンは、より複雑なデータのフィルタリング、検索、または処理を必要とする複雑なデータ管理システムまたはデータ処理システムに非常に適しています。高い柔軟性
以上、内容の側面も含めて PHP のデザインパターンを紹介しました(再録)。PHP チュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。