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 文件上传源码分析(RFC1867)
Oct 30 PHP
PHP开发不能违背的安全规则 过滤用户输入
May 01 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
Jun 24 PHP
php堆排序(heapsort)练习
Nov 13 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 PHP
Codeigniter发送邮件的方法
Mar 19 PHP
php中使用sftp教程
Mar 30 PHP
PHP递归调用数组值并用其执行指定函数的方法
Apr 01 PHP
php显示页码分页类的封装
Jun 08 PHP
PHP数据库操作三:redis用法分析
Aug 16 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 #PHP
PDO实现学生管理系统
Mar 21 #PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 #PHP
YII2框架使用控制台命令的方法分析
Mar 18 #PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 #PHP
You might like
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
PHP新手上路(九)
2006/10/09 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
2011/05/04 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
php跨服务器访问方法小结
2015/05/12 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
vue-cli3 从搭建到优化的详细步骤
2019/01/20 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
Windows下为Python安装Matplotlib模块
2015/11/06 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
创业计划书中要认真思考的问题
2013/12/28 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL