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 相关文章推荐
默默简单的写了一个模板引擎
Jan 02 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
wamp安装后自定义配置的方法
Aug 23 PHP
php json转换成数组形式代码分享
Nov 10 PHP
PHP实现动态柱状图改进版
Mar 30 PHP
PHP遍历目录文件的常用方法小结
Feb 03 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 PHP
php去除数组中为0的元素的实例分析
Nov 17 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
php include,include_once,require,require_once
2008/09/05 PHP
php中strtotime函数用法详解
2014/11/15 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
初学JavaScript第二章
2008/09/30 Javascript
javascript removeChild 使用注意事项
2009/04/11 Javascript
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
原生JS实现简单的无缝自动轮播效果
2018/09/26 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
jQuery的ztree仿windows文件新建和拖拽功能的实现代码
2018/12/05 jQuery
基于form-data请求格式详解
2019/10/29 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
在Vue中使用Echarts实例图的方法实例
2020/10/10 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
python 根据pid杀死相应进程的方法
2017/01/16 Python
python 统计代码行数简单实例
2017/05/04 Python
浅谈python import引入不同路径下的模块
2017/07/11 Python
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
工程质量承诺书
2014/03/27 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
感恩教师节主题班会
2015/08/12 职场文书