ホームページ >php教程 >php手册 >PHPの「Simple Factory Pattern」のサンプルコード説明

PHPの「Simple Factory Pattern」のサンプルコード説明

WBOY
WBOYオリジナル
2016-06-13 11:58:16889ブラウズ

単純なファクトリ パターン:
①抽象基本クラス: クラス内にいくつかの抽象メソッドを定義し、サブクラスに実装します
②抽象基本クラスを継承するサブクラス: 基本クラスに抽象メソッドを実装します
③ ファクトリ クラス: 使用オブジェクトをインスタンス化します

記事を読んだ後、この図をもう一度見ると、効果がさらに良くなります



カプセル化メソッドの使用

コードをコピー コードは次のとおりです。


class Calc{
/**
* 計算結果
*
* @param int|float $num1
* @param int|float $num2
* @param string $operator
* @return int|float
*/
public function Calculate($num1,$num2,$operator){
try {
$result=0; >switch ( $operator){
case ' ':
$result= $num1 $num2;
case '-':
$result= $num1-$num2;
ブレーク;
ケース '*':
$result= $num1*$num2;
ブレーク;
ケース '/':
if ($num2==0) {
throw new Exception("除数を 0 にすることはできません");
$result= $num1/$num2;
return $result; >}catch ( Exception $e){
echo "入力が間違っています:".$e->getMessage();
}
}
}
$test=new Calc( );
// echo $test->calculate(2,3,' ');//Print: 5
echo $test->calculate(5,0,'/');//印刷: you 間違った入力: 除数を 0 にすることはできません


利点: 上記のコードは、include クラスが含まれている限り、他のページでも使用できます。気軽に使ってください
欠点: 柔軟な拡張と保守ができない
例: 「剰余」演算を追加したい場合は、switch ステートメント ブロックに分岐ステートメントを追加する必要があり、コードは以下のように変更しました
分岐ステートメントを追加します


コードをコピーします

コードは次のとおりです:

class Calc{ public function Calculate($num1,$ num2,$operator){ try { $result=0;

switch ($operator){

//。 ..省略されました...
case '%':
$result= $num1%$num2;
break
//...省略されました...
}
}catch (Exception $e){
echo "入力が間違っています:".$e->getMessage();
}
}
?>

コード分析: 上記の方法を使用して電卓に新しい関数演算を追加すると、次のような欠点があります
① 「新しい関数を追加」するには、元のコード ブロックを変更する必要があり、コード ブロックが変更される可能性があります。 、誤って元のコードを修正しました
② 追加する関数が多い場合 (例: 'べき乗'、'平方根'、'対数'、'三角関数'、'統計')、または追加するプログラマーAnd、Or、Not、Xor などの特定の計算関数では、switch ステートメントに N 個の分岐ステートメントを追加する必要があります。計算関数に 20 または 30 の case 分岐ステートメントがある場合、コードが 1 画面を超えることを想像してください。コードの可読性が大幅に低下するだけでなく、小さな関数を追加するには、関連しない他の関数も追加する必要があります。説明: これはプログラムの実行効率を大幅に低下させます
解決策: OOP 継承とポリモーフィックなアイデアを採用します
単純なファクトリー パターンの初期実装


コードをコピーします

コードは次のとおりです:


/**

* 操作クラス * 抽象メソッドが含まれるため、クラスは抽象クラスとして宣言する必要があります */ abstract class Operation{ //抽象メソッドには関数を含めることはできませんbody

abstract public function getValue($num1,$num2);//サブクラスがこの関数関数を実装する必要があることが強く要求されます

}
/**
* 追加クラス
*/
class OperationAdd extends Operation {
public function getValue($num1,$num2){
return $num1 $num2;
}
}
/**
* 減算クラス
*/
class OperationSub extendsオペレーション {
public function getValue($num1,$num2){
return $num1-$num2;
}
}
/**
* 乗算クラス
*/
class OperationMul extends Operation {
public function getValue($num1,$num2){
return $num1*$num2;
}
}
/**
* 部門クラス
*/
クラスOperationDiv extends Operation {
public function getValue($num1,$num2){
try {
if ($num2==0){
throw new Exception("除数を 0 にすることはできません") ;
}else {
return $num1/$num2;
}catch (例外 $e){
echo "エラー メッセージ:".$e->getMessage() ;
}
}
}
?>


ここではまず、仮想基底クラスを宣言し、メソッドを指定します。サブクラスは基本クラス (getValue()) に実装する必要があります。
分析: オブジェクト指向の継承機能を使用すると、「べき乗」、「平方根」、「対数」などの元のプログラムを簡単に拡張できます。 、「三角関数」、「統計」など。



コードをコピー

コードは次のとおりです:


/**
* 剰余 (剰余) を求める
*
*/
class OperationRem extends Operation {
public function getValue($num1,$num2){
return $num1% $num12;
}
}
?>


必要なのは、別のクラス (このクラスは仮想基本クラスを継承します) を作成し、クラス内の対応する関数を完了することだけです。 (例:電力計算)、結合度が大幅に減少するため、将来のメンテナンスと拡張が容易になります
まだ未解決の問題があり、それは、プログラムがオペレータの入力に従って対応するオブジェクトをインスタンス化する方法です。ユーザー?
解決策: 別のクラスを使用してインスタンス化プロセスを実装します。このクラスはファクトリーです。
コードは次のとおりです。

コードをコピーしますコードは次のとおりです:


/**
* エンジニアリングクラス、主にオブジェクトの作成に使用されます
* 機能: 入力された操作シンボルに従って、ファクトリは適切なオブジェクトをインスタンス化できます
*
*/
class Factory{
public static function createObj($operate){
switch ($operate ){
case ' ':
return new OperationAdd();
case '-':
return new OperationSub();
case ' *':
return new OperationSub();
case '/':
return new OperationDiv();
}
}
$test=Factory::createObj('/');
$result=$test->getValue(23,0);
echo $result; ?>


元の記事、転載元を明記してください: http://www.cnblogs.com/hongfei/

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