ホームページ  >  記事  >  バックエンド開発  >  PHP_PHPチュートリアル「Simple Factory Pattern」のサンプルコード説明

PHP_PHPチュートリアル「Simple Factory Pattern」のサンプルコード説明

WBOY
WBOYオリジナル
2016-07-21 15:16:31867ブラウズ

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

この記事に戻ってこの写真を見ると、効果がさらに良くなります



カプセル化メソッドを使用する

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

class Calc{
/**
* 計算結果
*
* @param int|float $num1
* @param int|float $num2
* @param string $operator
* @return int|float
*/
public functionulate($num1, $num2,$ 演算子){
try {
$result=0;
switch ($operator){
case '+':
$result= $num1+$num2;
case '-':
$result = $num1- $num2;
case '*':
$result= $num1*$num2;
if ($num2==0) {
新しい例外をスローします。 "除数を 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,'/');//Print: エラーを入力しました: 除数を 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{ //抽象メソッドには関数本体を含めることはできません
abstract public function getValue($num1,$num2);//サブクラスがこの関数関数を実装することが強く要求されます
}
/**
*追加クラス
*/
class OperationAdd extends Operation {
public function getValue($num1,$num2){
return $num1+$num2
}
}
/**
*引き算のクラス
*/
class OperationSub extends Operation {
public function getValue($num1,$num2){
return $num1-$num2;
}
}
/**
* 掛け算のクラス
*/
class OperationMul extends Operation {
public function getValue($ num1,$num2){
return $num1*$num2;
}
}
/**
*部門クラス
*/
class OperationDiv extends Operation {
public function getValue($num1,$num2){
try {
if ($num2==0 ){
throw new Exception("除数を 0 にすることはできません");
}else {
return $num1/$num2;
}
}catch (Exception $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()
break;
新しいOperationSub();
break;
return new OperationSub()
break;
new OperationDiv()
}
$ test=Factory::createObj ('/');
$result=$test->getValue(23,0);


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




http://www.bkjia.com/PHPjc/325885.html

www.bkjia.com
tru​​e
http://www.bkjia.com/PHPjc/325885.html

技術記事

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