ホームページ php教程 php手册 Warcraft の PHP デザイン パターンを見てみる

Warcraft の PHP デザイン パターンを見てみる

Jun 21, 2016 am 08:56 AM
php

少し前に、World of Warcraft を使用してデザイン パターンを説明している人を見かけました。非常に興味深い内容だったので、変更してデザイン パターンのコンテンツを追加しました。先人の内容を明示せずに借用している部分もありますので、先人の方は気分を害されないようお願いします。

ここでは、誰もが興味を持っている Warcraft 3 を使用して、PHP のいくつかの一般的な設計パターン (シングルトン モード、ストラテジー モード、ファクトリー モード、オブザーバー モード) について説明します。今日はこれら 4 つについて説明し、後で続けましょう。

これらの設計パターンはすべてオブジェクト指向のため、すべて PHP5 を使用しています。また、ここで言いたいのは、PHP4 は 2008 年 8 月 8 日に開始されたということです (北京オリンピックと同じ日だったと記憶しています)。しかし、私はそれを検証していません (笑)、公式は PHP4 の最後のパッチをリリースしました。これは、PHP4 の時代が終わったことを意味します。したがって、今は PHP4 を無視して、単に例として PHP5 を使用することをお勧めします。

1. 単体モード:

提起された質問:

このタイプのリソースは 1 つしかないため、一部のアプリケーション リソースは排他的です。たとえば、データベース ハンドルを介したデータベースへの接続は排他的です。アプリケーション全体でデータベース ハンドルを共有する必要があるのは、接続を開いたままにするか閉じたままにするときにオーバーヘッドが発生するためであり、単一ページをフェッチするプロセスではさらにオーバーヘッドがかかるからです。

問題の解決策:

それでは、World of Warcraft のプレイを始めましょう。まず、war3.exe をダブルクリックすると、Warcraft が実行を開始します。コードでやってみましょう。

クラス戦争3
{

パブリック関数 __construct()

{

echo "War3 が実行中です。","
";

}
}
$war = 新しい War3();

走れ!素晴らしい、成果

War3 が実行中です。

すでにゲームを開始できますが、コードの最後に別の

を追加すると

$war2 = new War3();

$war3 = 新しい War3();

何が起こるでしょうか?試してみましょう。出力は次のとおりです:

War3 が実行中です。

War3 が実行中です。

War3 が実行中です。

それだけです。誤って 2 回ダブルクリックして 3 World of Warcraft を開いた場合、さらに数回ダブルクリックすると、間違いなくコンピューターが爆発します。 。 。解決策を考えてみましょう。

このクラスはそう気軽にインスタンス化できないため、コンストラクターをプライベート メソッドに変更します。

クラス戦争3
{

プライベート関数 __construct()

{

echo "War3 が実行中です。","
";

}
}

しかし、プライベート変数には外部からアクセスできないため、開くことさえできません。心配しないで、インスタンス化せずに外部からアクセスできる別の関数、つまり静的関数
を追加しましょう。 クラス戦争3
{

プライベート関数 __construct()

{

echo "War3 が実行中です。","
";

}

パブリック静的関数 runWar()

{

}
}

この静的メソッド runWar() を通じて、クラス War3 のインスタンス化を制御します。その後、まだ識別子が不足しているため、別の識別子を作成し、この識別子を使用してクラスがインスタンス化されているかどうかを示します。ハンドルを直接返します。

クラスを

に変更します

クラス戦争3
{

保護された静的 $_instance = null;

プライベート関数 __construct()

{

echo "War3 が実行中です。","
";

}

パブリック静的関数 runWar()

{

if (null === self::$_instance) {

self::$_instance = new self();

}


自分自身を返す::$_instance;

}
}

もちろん、World of Warcraft を実行するときにインスタンス化メソッドを変更する必要もあります。
を使用するだけです。 $war = War3::runWar();
World of Warcraft のプレイを開始できます。完全なコードは次のとおりです:

クラス戦争3
{

保護された静的 $_instance = null;

プライベート関数 __construct()

{

echo "War3 が実行中です。","
";

}

パブリック静的関数 runWar()

{

if (null === self::$_instance) {

self::$_instance = new self();

}


自分自身を返す::$_instance;

}
}

$war = War3::runWar();
$war2 = War3::runWar();
$war3 = War3::runWar();

実行すると結果は次のようになります:

War3 が実行中です。

すごいですね、何度ダブルクリックしても World of Warcraft を 1 つだけ実行しました。これで、どのように開いてもマシンは爆発しません。

これは伝説的な単価モデルで、主に多くのリソースを消費し、インスタンスが 1 つだけで十分な場合に使用されます。たとえば、zend フレームワークの Zend_Controller_Front フロントエンド コントローラーは単価モデルを使用して設計されています。ご興味があれば、ぜひご覧ください。

2. 戦略モード:

提起された質問:

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

問題の解決策:

ははは、それほど複雑ではありません。World of Warcraft をようやく開いたので、World of Warcraft をプレイしてみましょう。
次に戦闘を選択します。人間、オーク(ORC)、ナイトエルフ(ナイエルフ)、アンデッド(アンデッド)など、非常に多くの種族があります。私はナイ エルフを選択し、次にエルフ 1 人とオーク 2 人 (ORC) を選択します。1 人のオークは私と同じ家族の出身で、もう 1 人のエルフとオークは別の家族の出身です。

すべてのプレイヤーは、ゲームに入ると、ホール、5 つのエルフ (ピオン)、鉱山などのリソースを獲得します。これらは初期化のものと呼ぶことができ、ここでは戦略パターンを使用してこれらの初期化をカプセル化できます。

本題に入りますが、まずプレーヤー クラスを構築しましょう:

クラスプレイヤー
{

//プレイヤー名

保護された $_name;

//レース

保護された $_race;

//チーム

$army を保護しました;

//建物

保護された $building;

//人口

保護された $population;

//ゴールド

$gold を保護しました;

//木

$wood を保護しました;

//コンストラクター、レースを設定してください

パブリック関数 __construct($race)

{

$this->レース = $race;


}

//__get() メソッドは保護された属性を取得するために使用されます

プライベート関数 __get($property_name)

{

if(isset($this->$property_name)) {

return($this->$property_name);

}

else {

return(NULL);

}

}

//__set() メソッドは保護属性の設定に使用されます

プライベート関数__set($property_name,$value)

{

$this->$property_name=$value;

}
}

次に、プレーヤーの初期化用の別のインターフェイスを構築します。

インターフェースInitialPlayer
{

//初期化された軍隊を作成します

パブリック関数 giveArmy($player);

//初期化された建物を作成します

パブリック関数 giveBuilding($player);

//リソースを初期化します

パブリック関数 giveSource($player);
}

わかりました。ここではこのインターフェースを実装する必要があります。便宜上、2 つの種族のみを選択し、これら 2 つの種族の初期化のみを記述しました。

最初はエルフです:

クラス NighyElfInitial は、initialPlayer
を実装します。 {

//初期化された軍隊を作成します

パブリック関数 giveArmy($player)

{

//5 人のエルフ

for($i=0; $i {

$creator = new CreatArms();//これは部隊クラスを作成するためのもので、後でファクトリー モードで使用されるため、ここではこれ以上は説明しません

$player->army[] = $creator->Creat('Wisp','./Arms/');

}

}

//初期化された建物を作成します

パブリック関数 giveBuilding($player)

{

$creator = new CreatBuildings();

//ベース

$player->building[] = $creator->Creat('TownHall','./Buildings/');

//鉱山

$player->building[] = $creator->Creat('Mine','./Buildings/');

}

//人口上限を初期化します

パブリック関数 giveSource($player)

{

$player->population= 10;

$player->ゴールド= 1000;

$player->wood= 100;

}

}

次はオークです:

クラス ORCInitial は、initialPlayer
を実装します。 {

//初期化された軍隊を作成します

パブリック関数 giveArmy($player)

{

//5 つの牡丹

for($i=0; $i {

$creator = new CreatArms();//これは部隊クラスを作成するためのもので、後でファクトリー モードで使用されるため、ここではこれ以上は説明しません

$player->army[] = $creator->Creat('Peon','./Arms/');

}

}

//初期化された建物を作成します

パブリック関数 giveBuilding($player)

{

$creator = new CreatBuildings();

//ベース

$player->building[] = $creator->Creat('TownHall','./Buildings/');

//鉱山

$player->building[] = $creator->Creat('Mine','./Buildings/');

}

//人口上限を初期化します

パブリック関数 giveSource($player)

{

$player->population= 10;

$player->ゴールド= 1000;

$player->wood= 100;

}

}



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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles