设计模式-简单工厂模式
来源:互联网 发布:java的compare方法 编辑:程序博客网 时间:2024/05/21 08:45
一、为什么要用工厂模式
用一个简单的场景举例为什么要用工厂模式。
假如我们要开发一个计算器,计算器目前有加减乘除四种运算,目前我们可以在一个函数里用一个switch来判断。
function operate($number1,$number2,$operate){ switch ($operate){ case '+': return $number1+$number2; case '-': return $number1-$number2; case '*': return $number1*$number2; case '/': if(0 != $number2) return $number1/$number2; return false; }}
目前看来是没有什么问题,但是如果我们接下来扩展这个计算器呢,加上x^y,x%y,logx等等,那么每一个操作都要添加到这个switch里,最终将导致这个switch会非常大,同时每一个操作都要进行全部的比对,维护起来将会很蛋疼,而且代码本身的可读性也会非常差,更不要说如果做的操作复杂一些的话,每一个switch都会很长。
二、使用简单工厂模式
使用面向对象的方法来解决问题。
1. 我们把加减乘除这些操作都分散到每一个类里,成为他们的功能。
2. 通过一个专门的类来判断实例化哪一个类的对象。
三、php代码实现
/** * 简单工厂模式。 * 主要用于解决各种实例化对象的问题。 * @author sui * @date 2016-2-15 */class SimpleFactory{ public static function createProduct($productType){ $operationClass = "Operation".$productType; return new $operationClass(); }}abstract class Operation{ //抽象方法“运算”,其子类必须实现operate这个方法 abstract public function operate($number1,$number2);}//加法类class OperationAdd extends Operation{ public function __construct () { echo "加法类被实例化\n"; } public function operate ($number1,$number2){ $result = $number1+$number2; echo "{$number1} + {$number2} = {$result}\n"; }}//减法类class OperationMinus extends Operation{ public function __construct () { echo "减法类被实例化\n"; } public function operate ($number1,$number2){ $result = $number1-$number2; echo "{$number1} - {$number2} = {$result}\n"; }}//乘法类class OperationMultiple extends Operation{ public function __construct () { echo "乘法类被实例化\n"; } public function operate ($number1,$number2){ $result = $number1+$number2; echo "{$number1} + {$number2} = {$result}\n"; }}//除法类class OperationDivide extends Operation{ public function __construct () { echo "除法类被实例化\n"; } public function operate ($number1,$number2){ if(0 != $number2){ $result = $number1+$number2; echo "{$number1} / {$number2} = {$result}\n"; }else{ echo "错误除数\n"; } }}
使用工厂模式:
$opAdd = SimpleFactory::createProduct('Add');echo $opAdd->operate(1,2);$opMinus = SimpleFactory::createProduct('Minus');echo $opMinus->operate(1,2);$opMultiple = SimpleFactory::createProduct('Multiple');echo $opMultiple->operate(1,2);$opDivide = SimpleFactory::createProduct('Divide');echo $opDivide->operate(1,2);
输出:
四、时序图和类图
时序图
类图
五、模式分析
- 将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易。
- 在调用工厂类的工厂方法时,由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数即可,在实际开发中,还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数时无须修改任何源代码。
- 简单工厂模式最大的问题在于工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。
- 简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
六、优缺点
0 0
- 简单工厂设计模式
- 设计模式-----简单工厂
- 简单工厂设计模式
- 设计模式:简单工厂
- 设计模式 - 简单工厂
- 设计模式 简单工厂
- 【设计模式】【简单工厂】
- 简单工厂设计模式
- 简单工厂设计模式
- 设计模式--简单工厂
- 简单工厂设计模式
- 简单工厂设计模式
- 设计模式------------简单工厂
- 设计模式--简单工厂
- 简单工厂设计模式
- 设计模式---------简单工厂
- 设计模式--简单工厂
- 简单工厂设计模式
- ios学习笔记(一)Windows7上使用VMWare搭建iPhone开发环境
- Mysql的配置max_connections不生效的问题
- View之ExpandableLists
- SAP接口编程-RFC系列10 : BAPI控件的DimAs方法
- Android 各类动画的使用方法
- 设计模式-简单工厂模式
- js去除数组重复元素
- Tachyon架构分析和现存问题讨论
- c#中new关键字的用处
- JAVA流
- ios学习笔记(二)第一个应用程序--Hello World
- 2.3.2笔记-归并有序链表
- ViewPager循环滑动及自动播放
- 问题