PHP中"简单工厂模式"实例代码讲解

2014-08-01  来源:本站原创  分类:php技巧  人气:1 

PHP中简单工厂模式实例代码,学习php类的朋友可以参考下

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

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

PHP中"简单工厂模式"实例代码讲解

采用封装方式

<?php
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语句块中添加一个分支语句,代码需要做如下改动
添加分支语句

复制代码 代码如下:

<?php
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的继承和多态思想
简单工厂模式的初步实现

复制代码 代码如下:

<?php
/**
* 操作类
* 因为包含有抽象方法,所以类必须声明为抽象类
*/
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())
分析:通过采用面向对象的继承特性,我们可以很容易就能对原有程序进行扩展,比如:‘乘方',‘开方',‘对数',‘三角函数',‘统计'等等。

复制代码 代码如下:

<?php
/**
* 求余类(remainder)
*
*/
class OperationRem extends Operation {
public function getValue($num1,$num2){
return $num1%$num12;
}
}
?>

我们只需要另外写一个类(该类继承虚拟基类),在类中完成相应的功能(比如:求乘方的运算),而且大大的降低了耦合度,方便日后的维护及扩展
现在还有一个问题未解决,就是如何让程序根据用户输入的操作符实例化相应的对象呢?
解决办法:使用一个单独的类来实现实例化的过程,这个类就是工厂
代码如下:

复制代码 代码如下:

<?php
/**
* 工程类,主要用来创建对象
* 功能:根据输入的运算符号,工厂就能实例化出合适的对象
*
*/
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/

相关文章
  • PHP中"简单工厂模式"实例代码讲解 2014-08-01

    PHP中简单工厂模式实例代码,学习php类的朋友可以参考下 简单工厂模式: ①抽象基类:类中定义抽象一些方法,用以在子类中实现 ②继承自抽象基类的子类:实现基类中的抽象方法 ③工厂类:用以实例化对象 看完文章再回头来看下这张图,效果会比较好 采用封装方式 <?php class Calc{ /** * 计算结果 * * @param int|float $num1 * @param int|float $num2 * @param string $operator * @return int|f

  • C++设计模式之简单工厂模式实例 2014-07-14

    这篇文章主要介绍了C++设计模式之简单工厂模式实例,工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品,需要的朋友可以参考下 问题描述 之前在公司做了一个windows 8平台的阅读器.首先,需要将电子书中的内容渲染到屏幕上,而电子书每一页都包含各种各样的内容,比如:图形.图像和文字等等:不同的内容,就是不同的对象:在将不同的内容渲染到屏幕上之前,就需要new操作,建立不同的对象,然后再在屏幕上进行描绘.这个时候,就需要进行很多new操作,new操作分布在代

  • iOS设计模式(代码分析系列2:简单工厂模式) 2014-09-09

    简单工厂模式示例代码下载地址, 1.简述 首先需要说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工作方法模式,是工厂方法模式的特殊实现(也就是说工厂模式包含简单工厂模式).这里对简单工厂模式进行介绍,是为后面的工厂方法和抽象工厂模式做一个引子. 2.定义 "专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类." 世界上就是由一个工厂类,根据传入的参数,动态地决定创建出哪一个产品类的实例. 3.结构图 简要分析结构图: ConcreteProduct

  • 简单工厂模式&&工厂方法模式&&抽象工厂模式 2015-01-04

    1.背景 工厂模式是常用的实例化对象模式,是用工厂方法代替new操作的一种模式. 以类Sample为例, 如果要创建Sample的实例对象,new操作方式: Sample sample=new Sample(); 可是,实际情况下,通常要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等. 首先,想到的是可以使用Sample的构造函数,生成实例就写成: Sample sample=new Sample(参数); 但是,如果创建sample实例时所做的初始化工作不是像赋值这样简单的事

  • 大话设计模式--第1章 代码无错就是优?--简单工厂模式 2015-02-15

    1.1 面试受挫 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数份简历后,终于收到了一个单位的面试通知,小菜欣喜若狂. 到了人家单位,前台小姐给了他一份题目,上面写着:"请用C++.Java.C#或VB.NET任意一种面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果." 小菜一看,这个还不简单,三下五除二,10分钟不到,小菜写完了,感觉也没错误.交卷后,单位说一周内等通知吧.于是小菜只得耐心等

  • Zend Framework中的简单工厂模式 图文 2015-02-05

    某天又然后想到好久没复习设计模式了.综合一下,复习一个设计模式之后在ZF中找一下使用这模式的源码吧,不读所有源码,读读比较"高级"的部分吧,要说模式,暂时不知道是不是所有模式ZF里面都有,但是应该有足够的模式够我最近看了,在说可以找找其他开源的软件来找模式 前段时间用来ZF,把他当黑盒感觉不是很好,一直有看其源码的冲动,但是...如果一点一点点看的话,挑战确实有些大了.某天又然后想到好久没复习设计模式了.综合一下,复习一个设计模式之后在ZF中找一下使用这模式的源码吧,不读所有源码,读读

  • 代码设计模式之简单工厂模式(Factory) 2014-07-08

    简单工厂模式 核心思想是用一个工厂来根据输入的条件产生不同的类,(返回父类接口或抽象类接口). 其次利用多态原理,将实现类(继承于抽象接口)各自进行自己的实现.这样的话,在实现类中是一个高内聚的类,类与类之间没有任何关系. 优点: 1. 对调用者来说不需要关系结果是由谁来实现,关心的是工厂提供的是客户想要的结果. 2.对于扩展来说,对原来代码无影响,只需要扩展实现类,无须改动原代码. 缺点: 1.每次有新的扩展类增加,都需要去改动工厂的代码,这相工厂与实现的依赖性比较强,两者间的耦合性较高. 2

  • java中UDP简单聊天程序实例代码 2015-04-03

    这篇文章主要介绍了java中UDP简单聊天程序实例代码,有需要的朋友可以参考一下 学过计算机网络通信的都知道,计算机之间传送数据由两种,即TCP通信和UDP通信.TCP是可靠的面向连接的通信协议,二UDP是不可靠的面向无连接的通信协议. java中有基于TCP的网络套接字通信,也有基于UDP的用户数据报通信,UDP的信息传输速度快,但不可靠! 基于UDP通信的基本模式: (1)将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地. (2)接受别人发来的数据包(好比接收信封一样

  • (三)简单工厂模式详解 2015-01-23

    上一章我们着重讨论了代理模式,以及其实现原理,相信如果你看完了整篇博文,应该就对代理模式很熟悉了. 本章我们讨论简单工厂模式,LZ当初不小心夸下海口说不和网络上传播的教学式模式讲解雷同,所以现在感觉写一篇博文压力颇大. 如何来介绍简单工厂呢,LZ着实费了不少心思,这个模式本身不复杂,但其实越是不复杂的模式越难写出特点,因为它太简单. 为了便于各位看后面例子的时候容易理解,LZ这里先给出引自其它地方的简单工厂模式的定义. 定义:从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方

  • 设计模式----简单工厂模式 2013-11-07

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 实现方式(附图) 简单工厂模式的UML类图(见上图) 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 该模式中包含的角色及其

  • 小菜编程成长记:第五章 体会简单工厂模式的美妙 2014-10-18

    次日,小菜再来找大鸟,问道:"你昨天说计算器这样的小程序还可以用到面向对象三大特性?继承和多态怎么可能用得上,我实在不可理解." 大鸟:"小菜很有钻研精神吗?好,今天我让你功力加深一级.你先要考虑一下,你昨天写的这个代码,能否做到很灵活的可修改和扩展呢?" 小菜:"我已经把业务和界面分离了呀,这不是很灵活了吗?" 大鸟:"那我问你,现在如果我希望增加一个开根(sqrt)运算,你如何改?" 小菜:"那只需要改Opera

  • 设计模式学习笔记--简单工厂模式 2012-05-24

    简单工厂主要是为了选择实现的,一个接口Api,在第一种情况下需要选择ApiImplA实现,在第二种情况下需要选择ApiImplB实现,此时我们一般会创建一个工厂类来生产接口Api的实例 类图如下: 实例代码如下: package hx.designpattern.simplefactory; public interface Api { void operation(); } package hx.designpattern.simplefactory; public class ApiImpl

  • 设计模式-工厂(简单工厂模式) 2012-06-26

    在网上找的一段对抽象工厂(简单工厂模式)对它的概述: 简单工厂模式又称静态工厂方法模式.重命名上就可以看出这个模式一定很简单.它存在的目的很简单:定义一个用于创建对象的接口. 在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样. 先来看看它的组成: 1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑.在java中它往往由一个具体类实现. 2) 抽象产品角色

  • 简单工厂模式 与 工厂方法模式 详解 2013-05-15

    简单工厂模式 依赖倒置原则(DIP)扶弱抑强 们应该优先依赖于抽象类,而避免依赖于具体类.当这些具体类不稳定时,更应该如此,因此下面的范例 它违反了DIP,SomeApp依赖于接口Shape,而且完全通过Shape接口来使用Shape的实例.它没有使用Square类或者Circle类的任何特定方法.糟糕的是,SomeApp也创建了Square和Circle的实例,因此就不得不依赖于这些具体类. 所以要用Factory模式来修正. Java代码 public interface ShapeFact

  • 简单工厂模式-创建型模式1 2013-09-03

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 定义: 提供一个创建对象实例的功能,无须关心具体实现,被创建实例的类型可以是接口.抽象类.具体类. 结构: 说明: Api:功能接口: ImpA,ImpB:接口实现: Factory:工厂,选择合适的实现来创建接口Api对象: Client:客户端,通过Factory来获取Api对象,实现面向接口编程(封装隔离). 具体代码: Api接口

  • 简单工厂模式和抽象工厂模式 2014-04-04

    简单工厂模式和抽象工厂模式 创建型模式抽象了实例化过程.他们帮助一个系统独立于如何创建.组合和表示他的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象. 随着系统演化得越来越依赖于对象复合而不是类继承,创建型模式变得更为重要.当这种情况发生时,重心从对一组固定行为的硬编码(hard-coding)转移为定义一个较小的基本行为集,这些行为可以被组合成任意数目的更复杂的行为.这样创建有特定行为的对象要求的不仅仅是实例化一个类. 场景:电脑组装 简单工厂

  • 揭秘设计模式:工厂模式(一)简单工厂模式(Simple Factory) 2014-11-28

    链接地址:http://www.xx566.com/detail/133.html 提到工厂模式,我们并不陌生,在23中设计模式中,有工厂方法(Factory Method)模式.抽象工厂(Abstract Factory)模式,都是工厂模式的形态,在这之外,还有一种简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,接下来,我们就来学习一下简单工厂模式. 简单工厂模式,其实算是工厂方法模式的一个特殊实现, 即由一个工厂对象决定创建出

  • asp.net 简单工厂模式和工厂方法模式之论述 2013-10-07

    简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了于具体产品的依赖 简单工厂模式和工厂方法模式的区别 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了于具体产品的依赖.而工厂方法模式定义了一个用于创建对象的借口,让子类决定实例化哪一个类,工厂方法是一个类的实例化延迟到其子类.其实多做一些联系不难发现:工厂方法模式实现时,客户端需要决定实例化那个工厂来实现运算类

  • php设计模式之简单工厂模式详解 2013-11-05

    这篇文章主要介绍了php设计模式的简单工厂模式,又称为静态工厂方法模式,是一种重要的PHP设计模式,需要的朋友可以参考下 本文以实例形式较为详细的介绍了PHP设计模式的简单工厂模式,对于进行PHP程序设计来说有很好的借鉴作用.具体如下: 一.概念 简单工厂模式 [静态工厂方法模式](Static Factory Method) 是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory)又叫做 静态工厂方法模式(Static Factory Method) 2.工厂方法

  • c#使用简单工厂模式实现生成html文件的封装类分享 2014-03-29

    这篇文章主要介绍了运用了简单工厂模式实现页面静态化封装类,思路比较简单,大家可根据自己的思路再扩展此类 由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式,先来看看静态类的父类:StaticBase(抽象类) public abstract class StaticBase : IDisposable { /// <summary> /// 默认编码方式 ///