加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_郴州站长网 (http://www.0735zz.com/)- 云通信、区块链、物联设备、云计算、站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP设计模式之原型设计模式原理与用法详解

发布时间:2022-07-01 12:43:37 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了PHP设计模式之原型设计模式,简单描述了原型设计模式的概念、原理并结合实例形式分析了php原型设计模式的定义与使用方法,需要的朋友可以参考下 本文实例讲述了PHP设计模式之原型设计模式原理与用法。分享给大家供大家参考,具体如下: 一、
  这篇文章主要介绍了PHP设计模式之原型设计模式,简单描述了原型设计模式的概念、原理并结合实例形式分析了php原型设计模式的定义与使用方法,需要的朋友可以参考下
 
  本文实例讲述了PHP设计模式之原型设计模式原理与用法。分享给大家供大家参考,具体如下:
 
  一、什么是原型设计模式
 
  原型设计模式使用一种克隆技术来复制实例化的对象,新对象是通过复制原型实例创建的。原型设计模式的目的是通过使用克隆以减少实例化对象的开销。
 
  在原型设计模式中,Client类是不可缺少的一部分。
 
  PHP有一个内置的克隆方法__clone()可以在设计模式中使用,但是不能直接访问,使用clone关键字即可。克隆不会启动构造函数。
 
  二、什么时候使用原型设计模式
 
  如果一个项目要求你创建某个原型对象的多个实例,就可以使用原型设计模式。
 
  三、原型设计模式实例
 
  这里以现代企业组织为例:
 
  <?php
  /**
  *  原型设计模式
  *        以现代企业组织为例
  **/
  //部门抽象类
  abstract class IAcmePrototype
  {
    protected $id;   //员工ID号
    protected $name;  //员工名字
    protected $dept;  //员工部门
    //克隆方法
    abstract function __clone();
    //员工部门设置方法
    abstract function setDept($orgCode);
    //员工部门获取方法
    public function getDept()
    {
      return $this->dept;
    }
    //员工ID号设置方法
    public function setId($id)
    {
      $this->id = $id;
    }
    //员工ID号获取方法
    public function getId()
    {
      return $this->id;
    }
    //员工名字设置方法
    public function setName($name)
    {
      $this->name = $name;
    }
    //员工名字获取方法
    public function getName()
    {
      return $this->name;
    }
  }
  //市场部类
  class Marketing extends IAcmePrototype
  {
    const UNIT = "Marketing";  //标识
    //市场部门类别
    private $sales = "sales";
    private $promotion = "promotion";
    private $strategic = "strategic planning";
    //克隆函数
    function __clone()
    {
    }
    //部门设置函数
    public function setDept($orgCode)
    {
      switch($orgCode)
      {
        case 101:
            $this->dept = $this->sales;
            break;
        case 102:
            $this->dept = $this->promotion;
            break;
        case 103:
            $this->dept = $this->strategic;
            break;
        default:
            $this->dept = "Unrecognized Marketing";
      }
    }
  }
  //管理部类
  class Management extends IAcmePrototype
  {
    const UNIT = "Management";
    private $research = "research";
    private $plan = "planning";
    private $operations = "operations";
    function __clone()
    {
    }
    public function setDept($orgCode)
    {
      switch($orgCode)
      {
        case 201:
            $this->dept = $this->research;
            break;
        case 202:
            $this->dept = $this->plan;
            break;
        case 203:
            $this->dept = $this->operations;
            break;
        default:
            $this->dept = "Unrecognized Marketing";
      }
    }
  }
  //工厂部类
  class Engineering extends IAcmePrototype
  {
    const UNIT = "Engineering";
    private $development = "programming";
    private $design = "digital artwork";
    private $sysAd = "system administration";
    function __clone()
    {
    }
    public function setDept($orgCode)
    {
      switch($orgCode)
      {
        case 301:
            $this->dept = $this->development;
            break;
        case 302:
            $this->dept = $this->design;
            break;
        case 303:
            $this->dept = $this->sysAd;
            break;
        default:
            $this->dept = "Unrecognized Marketing";
      }
    }
  }
  //客户类
  class Client
  {
    private $market;  //市场部类实例
    private $manage;  //管理部类实例
    private $engineer; //工厂部类实例
    //构造函数
    public function __construct()
    {
      $this->makeConProto();
      //市场部类实例克隆
      $Tess = clone $this->market;
      $this->setEmployee($Tess,"Tess Smith",101,"ts101-1234");
      $this->showEmployee($Tess);
      $Jacob = clone $this->market;
      $this->setEmployee($Jacob,"Jacob Jones",102,"jj101-2234");
      $this->showEmployee($Jacob);
      //管理部类实例克隆
      $Ricky = clone $this->manage;
      $this->setEmployee($Ricky,"Ricky Rodrigues",203,"rr203-5634");
      $this->showEmployee($Ricky);
      //工程部类实例克隆
      $Olivia = clone $this->engineer;
      $this->setEmployee($Olivia,"Olivia perez",302,"op302-1278");
      $this->showEmployee($Olivia);
      $John = clone $this->engineer;
      $this->setEmployee($John,"John Jackson",301,"jj301-1454");
      $this->showEmployee($John);
    }
    //实例化部门对象
    private function makeConProto()
    {
      $this->market = new Marketing();
      $this->manage = new Management();
      $this->engineer = new Engineering();
    }
    //员工信息设置方法
    private function setEmployee(IAcmePrototype $employee,$name,$dept,$id)
    {
      $employee->setName($name);
      $employee->setDept($dept);
      $employee->setId($id);
    }
    //员工信息显示方法
    private function showEmployee(IAcmePrototype $employee)
    {
      echo $employee->getName() . '<br />';
      echo $employee->getDept() . '<br />';
      echo $employee->getId() . '<br />';
    }
  }
  $client = new Client();
  ?>
  运行结果:
 
  Tess Smith
  sales
  ts101-1234
  Jacob Jones
  promotion
  jj101-2234
  Ricky Rodrigues
  operations
  rr203-5634
  Olivia perez
  digital artwork
  op302-1278
  John Jackson
  programming
  jj301-1454 

(编辑:开发网_郴州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读