注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Copper peas ' Bolg

Keep On Moving...This Is My Life...

 
 
 

日志

 
 

【原】 PHP 设计模式七之原型设计模式  

2011-06-10 17:17:20|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

<?php
/**
 * 计算器简单  原型设计模式 也叫克隆(复制)模式【深复制,浅复制】
 * 此处案例:把工厂方法设计模式使用原型设计模式来实现方便理解。为了避免创建一个与产品类层次平等的工厂类层次时,就可以使用原型设计模式。
 *
 * 定义:Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
   [
          当要实例化的类是在运行时刻指定时,例如,类是通过动态装载;或者 为了避免创建一个与产品类层次平行的工厂类层次时;
          或者 当一个类的实例只能有几个不同状态组合中的一种时。 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
          详细文章看:
          http://hi.baidu.com/periskyl/blog/item/263fc0574fdf3247574e0024.html
          http://terrylee.cnblogs.com/archive/2006/01/16/317896.html
   ]
 * @author Chen Wei Han
 * @copyright Chen Wei Han 2011.06.07
 * @link http://csq-3.blog.163.com
 * @package demo
 * @version $Id: prototype.php 1 2011-06-07
 */

/** 
 * 抽象原型角色
 *
 */
interface Prototype {  
  public function copy();
}


/**
 * 算法管理类
 */
class OperationManager{
 
 private  $arrs=array();
 
 public function set($key,$value)
    {
       $this->arrs[$key] = $value;
    }
   
    public function get($key)
    {
       return $this->arrs[$key];
    }
 
}


/**
 *  具体的原型对象 算法类
 * 
 */
class Operation implements Prototype
{
 
  private $_operation;
  private $str;
 
  public function __construct($operation)
  {
   $this->_operation = $operation;
  }
  
  public function copy()
  {
   return clone $this;//浅拷贝
  }
 
     public function GetResult($numa,$numb)
  {    
   $this->str = $numa.$this->_operation.$numb;    
     eval("\$result = ".$this->str.";");   
     return $result;
  }
 
}


$OM = new OperationManager;

$numa=1;
$numb=2;
$oper='加';
   
$OM->set($oper,new Operation('+'));    
$object1 = $OM->get($oper)->copy();
echo $object1->GetResult($numa,$numb);
   
$numa=5;
$numb=2;
$oper='减';

$OM->set($oper,new Operation('-'));
$object2 = $OM->get($oper)->copy();
echo $object2->GetResult($numa,$numb); 


/*  注意:我这里的计算器例子只是为了对应设计模式一的工厂模式计算器方便读者理解,不是很好的例子。
 *  大家可以能注意到了,这里的具体的原型对象 算法类内部有不同的,就是加变减了,我这里巧妙使用eval来解决了,但如果业务逻辑太多
 *  这就很麻烦,所以要使用原型模式一定的子类仅仅在初始化的参数对象类别上有所不同,内部处理必须一样的才适用。
 *  等于就是工厂方法模式无限子类,而且子类内部处理基本一样的情况,原型模式最适合不过了,因为无限子类,工厂方法模式使用不合理了
 */ 

  评论这张
 
阅读(120)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018