ホームページ バックエンド開発 PHPチュートリアル PHP中“简单工厂模式”实例代码讲解_PHP

PHP中“简单工厂模式”实例代码讲解_PHP

Jun 01, 2016 pm 12:09 PM
工場出荷時のパターン

简单工厂模式:
①抽象基类:类中定义抽象一些方法,用以在子类中实现
②继承自抽象基类的子类:实现基类中的抽象方法
③工厂类:用以实例化对象

看完文章再回头来看下这张图,效果会比较好



采用封装方式
复制代码 代码如下:
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;
break;
case '-':
$result= $num1-$num2;
break;
case '*':
$result= $num1*$num2;
break;
case '/':
if ($num2==0) {
throw new Exception("除数不能为0");
}
$result= $num1/$num2;
break;
return $result;
}
}catch (Exception $e){
echo "您输入有误:".$e->getMessage();
}
}
}
$test=new Calc();
// echo $test->calculate(2,3,'+');//打印:5
echo $test->calculate(5,0,'/');//打印:您输入有误:除数不能为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个分支语句。想象下,一个计算功能的函数如果有二三十个case分支语句,代码将超过一屏,不仅令代码的可读性大大降低,关键是,为了添加小功能,还得让其余不相关都参与解释,这令程序的执行效率大大降低
解决途径:采用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())
分析:通过采用面向对象的继承特性,我们可以很容易就能对原有程序进行扩展,比如:‘乘方',‘开方',‘对数',‘三角函数',‘统计'等等。
复制代码 代码如下:
/**
* 求余类(remainder)
*
*/
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;
case '-':
return new OperationSub();
break;
case '*':
return new OperationSub();
break;
case '/':
return new OperationDiv();
break;
}
}
}
$test=Factory::createObj('/');
$result=$test->getValue(23,0);
echo $result;
?>

原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

Javaファクトリーパターンの利点は何ですか Javaファクトリーパターンの利点は何ですか Dec 25, 2023 pm 05:40 PM

Java ファクトリ パターンの利点: 1. システム結合の軽減、2. コードの再利用性の向上、3. オブジェクト作成プロセスの非表示、4. オブジェクト作成プロセスの簡素化、5. 依存関係注入のサポート、6. パフォーマンスの向上、7.テスト容易性の強化、8. 国際化のサポート、9. オープンとクローズの原則の推進、10. より優れたスケーラビリティの提供。詳細な紹介: 1. システムの結合を軽減します。ファクトリ パターンは、オブジェクト作成プロセスをファクトリ クラスに集中化することでシステムの結合を軽減します。2. コードの再利用性を向上します。

Javaフレームワークにおけるファクトリパターンの適用シナリオは何ですか? Javaフレームワークにおけるファクトリパターンの適用シナリオは何ですか? Jun 01, 2024 pm 04:06 PM

ファクトリ パターンは、オブジェクトの作成プロセスを分離し、それらをファクトリ クラスにカプセル化して具象クラスから分離するために使用されます。 Java フレームワークでは、ファクトリ パターンは次の目的で使用されます。 複雑なオブジェクト (Spring の Bean など) を作成する オブジェクトの分離を提供し、テスト容易性と保守性を強化する 拡張機能をサポートし、新しいファクトリ クラスを追加することで新しいオブジェクト タイプのサポートを強化する

Golangでファクトリーパターンを適用する方法 Golangでファクトリーパターンを適用する方法 Apr 04, 2024 am 11:33 AM

ファクトリ パターン Go では、ファクトリ パターンを使用すると、具体的なクラスを指定せずにオブジェクトを作成できます。オブジェクトを表すインターフェイス (Shape など) を定義します。このインターフェイスを実装する具象型 (Circle や Rectangle など) を作成します。ファクトリ クラスを作成して、特定のタイプのオブジェクト (ShapeFactory など) を作成します。ファクトリ クラスを使用して、クライアント コードでオブジェクトを作成します。この設計パターンにより、具体的な型に直接結合することなく、コードの柔軟性が向上します。

Java ファクトリ パターンの詳細な分析: 単純なファクトリ、ファクトリ メソッド、抽象ファクトリの違いを区別して適用する Java ファクトリ パターンの詳細な分析: 単純なファクトリ、ファクトリ メソッド、抽象ファクトリの違いを区別して適用する Dec 28, 2023 pm 03:09 PM

Java ファクトリ パターンの詳細な説明: 単純なファクトリ、ファクトリ メソッド、および抽象ファクトリの違いとアプリケーション シナリオを理解する はじめに ソフトウェア開発プロセスでは、複雑なオブジェクトの作成および初期化プロセスに直面したとき、多くの場合、この問題を解決するためにファクトリ パターンを使用する必要があります。問題。一般的に使用されるオブジェクト指向プログラミング言語として、Java はさまざまなファクトリ パターン実装を提供します。この記事では、Java ファクトリ パターンの 3 つの一般的な実装方法 (単純ファクトリ、ファクトリ メソッド、抽象ファクトリ) を詳細に紹介し、それらの違いとアプリケーション シナリオについて詳しく分析します。 1つ、

C++ 関数のオーバーロードと書き換えにおけるシングルトン モードとファクトリ モードの適用 C++ 関数のオーバーロードと書き換えにおけるシングルトン モードとファクトリ モードの適用 Apr 19, 2024 pm 05:06 PM

シングルトン パターン: 関数のオーバーロードを通じて、シングルトン インスタンスにさまざまなパラメーターを提供します。ファクトリ パターン: 関数の書き換えを通じてさまざまなタイプのオブジェクトを作成し、作成プロセスを特定の製品クラスから切り離します。

PHP デザイン パターン: コード エクセレンスへの道 PHP デザイン パターン: コード エクセレンスへの道 Feb 21, 2024 pm 05:30 PM

はじめに PHP デザイン パターンは、ソフトウェア開発における一般的な課題に対する実証済みのソリューションのセットです。これらのパターンに従うことで、開発者はエレガントで堅牢かつ保守しやすいコードを作成できます。これらは、開発者が SOLID 原則 (単一責任、オープン/クローズ、リスコフ置換、インターフェイスの分離、依存関係の反転) に従うのに役立ち、それによってコードの可読性、保守性、拡張性が向上します。デザイン パターンの種類 さまざまなデザイン パターンがあり、それぞれに独自の目的と利点があります。最も一般的に使用される PHP 設計パターンの一部を次に示します。 シングルトン パターン: クラスにインスタンスが 1 つだけあることを保証し、このインスタンスにグローバルにアクセスする方法を提供します。ファクトリ パターン: 正確なクラスを指定せずにオブジェクトを作成します。これにより、開発者は条件付きで次のことを行うことができます。

Javaファクトリパターンの詳細説明:単純ファクトリ、ファクトリメソッド、抽象ファクトリ Javaファクトリパターンの詳細説明:単純ファクトリ、ファクトリメソッド、抽象ファクトリ Dec 28, 2023 am 10:23 AM

Java ファクトリ パターンの詳細説明: 単純ファクトリ、ファクトリ メソッド、抽象ファクトリ ファクトリ パターンは、さまざまなニーズに応じてオブジェクトを動的に作成し、オブジェクトの作成と使用を分離し、再利用性と再利用性を向上させるために使用される、一般的に使用される設計パターンです。コードの使用、スケーラビリティ。 Java には、ファクトリ パターンの主な形式として、単純ファクトリ、ファクトリ メソッド、抽象ファクトリの 3 つがあります。 1. シンプル ファクトリ モデル シンプル ファクトリ モデルは、最も基本的なファクトリ モデルであり、最も単純な形式です。ファクトリ クラスを通じてオブジェクトを作成し、さまざまなパラメータに基づいてどのオブジェクトを作成するかを決定します。

PHP オブジェクト指向プログラミングのファクトリ パターンを理解する PHP オブジェクト指向プログラミングのファクトリ パターンを理解する Aug 10, 2023 am 10:37 AM

PHP オブジェクト指向プログラミングにおけるファクトリ パターンについて理解する ファクトリ パターンは、オブジェクトの作成プロセス中にオブジェクトの作成と使用を分離するために使用される、一般的に使用される設計パターンです。 PHP オブジェクト指向プログラミングでは、ファクトリ パターンはオブジェクトの作成とライフサイクルをより適切に管理するのに役立ちます。この記事では、PHP のファクトリー パターンをコード例を通して詳しく紹介します。 PHP では、 new キーワードを直接使用する代わりに、ファクトリ パターンを使用してオブジェクトの作成と初期化のプロセスを実装できます。この利点は、将来変更が必要になった場合に便利であることです。

See all articles