这篇文章主要介绍了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
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
本文标题为:PHP设计模式之原型设计模式原理与用法分析
基础教程推荐
- PHP实现Redis单据锁以及防止并发重复写入 2022-10-12
- laravel ORM关联关系中的 with和whereHas用法 2023-03-02
- PHP获取MySQL执行sql语句的查询时间方法 2022-11-09
- thinkphp3.2.3框架动态切换多数据库的方法分析 2023-03-19
- PHP命名空间简单用法示例 2022-12-01
- php array分组,PHP中array数组的分组排序 2022-08-01
- 使用PHP开发留言板功能 2023-03-13
- PHP中的错误及其处理机制 2023-06-04
- laravel 解决多库下的DB::transaction()事务失效问题 2023-03-08
- 在Laravel中实现使用AJAX动态刷新部分页面 2023-03-02