php设计模式之原型模式分析【星际争霸游戏案例】


Posted in PHP onMarch 23, 2020

本文实例讲述了php设计模式之原型模式。分享给大家供大家参考,具体如下:

我们一般用new来新增对象,不过很多时候新增一个对象需要一些工作。而星际里面往往会新增某些类的大量的对象,比如新增很多机枪兵和龙骑。

待解决的问题:我们能否减少new的使用,同时避免需要新增对象的时候,了解对象的类名。

思路:php5提供了克隆方法,我们可以新增一个对象,然后每次需要新增和她同类的对象,克隆他就可以了。

原型(Prototype)模式示例:

<?php
  //机枪兵类
  class Marine
  {
    //所属的用户ID
    public $playerID

    //构造函数,参数为用户的id
    public function __construct($id)
    {
      $this->playerID = $id;
    }
  }

  //兵种的管理类
  class TroopManager
  {
    //数组,用于存放多个兵种的原型
    public $troopPrototype = array();

    //增加原型,第一个参数为原型的名字,第二个参数为原型对象
    public function addPrototype($name, $prototype)
    {
      $this->troopPrototype[$name] = $prototype;
    }

    //获取原型的克隆,也就是替代new的方法,参数为原型的名字
    public function getPrototype($name)
    {
      return clone $this->troopPrototype[$name];
    }
  }

  //初始化兵种的管理类
  $manager = new TroopManager();

  //初始化两个属于不同玩家的机枪兵的原型
  $m1 = new Marine(1);
  $m2 = new Marine(2);

  //增加原型,同时用比较容易记忆的名字来命名原型
  $manager->addPrototype('Marine of 1', $m1);
  $manager->addPrototype('Marine of 2', $m2);

  //当需要新增对象的时候,我们可以不必知道对象的类名和初始化的工作
  $m3 = $manager->getPrototype('Marine of 1');
?>

用途总结:原型模式可以将新增对象的工作细节封装。

实现总结:需要一个原型管理类,实现增加和获取克隆原型的方法。注意这里由于为了简明,省略了一些东西,实际上我们可以在克隆方法上做一些改动,也可以用接口规范每个原型类。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php session 预定义数组
Mar 16 PHP
PHP 第二节 数据类型之字符串类型
Apr 28 PHP
php弹出对话框实现重定向代码
Jan 23 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
百度实时推送api接口应用示例
Oct 21 PHP
PHP生成条形图的方法
Dec 10 PHP
php编写的抽奖程序中奖概率算法
May 14 PHP
php判断linux下程序问题实例
Jul 09 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
PHP中如何判断exec函数执行成功?
Aug 04 PHP
php对xml文件的增删改查操作实现方法分析
May 19 PHP
Laravel 队列使用的实现
Jan 08 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
PHP中关于php.ini参数优化详解
Feb 28 #PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 #PHP
php 的多进程操作实践案例分析
Feb 28 #PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 #PHP
php的无刷新操作实现方法分析
Feb 28 #PHP
php下的原生ajax请求用法实例分析
Feb 28 #PHP
You might like
解决php接收shell返回的结果中文乱码问题
2014/01/23 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
JavaScript实现实时更新系统时间的实例代码
2017/04/04 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
说说node中的可读流和可写流的区别
2018/06/01 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
python连接sql server乱码的解决方法
2013/01/28 Python
python连接mysql调用存储过程示例
2014/03/05 Python
django静态文件加载的方法
2018/05/20 Python
Linux下python3.7.0安装教程
2018/07/30 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
python如何获取apk的packagename和activity
2020/01/10 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
详解Flask前后端分离项目案例
2020/07/24 Python
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
Linux内核产生并发的原因
2016/11/08 面试题
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
《确定位置》教学反思
2016/02/18 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
python开发人人对战的五子棋小游戏
2022/05/02 Python