原型模式

  概述:

  1、与工厂模式作用类似,都是用来创建对象

  2、与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象,这样就免去了类创建时重复的初始化操作

  3、原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需内存拷贝即可

  代码如下:

  1、编写一个画图类: 

 <?php
namespace IMooc; class Canvas{ public $data;
/**
* [生成一块宽为20,高为10的包含*的画布]
* @param integer $width [画布宽]
* @param integer $height [画布高]
* @return [type] [description]
*/
function init($width = 20, $height = 10){
$data = array();
for($i=0; $i<$height; $i++){
for($j=0; $j<$width; $j++){
$data[$i][$j] = '*';
}
} $this->data = $data;
}
/**
* [画画,也就是使用-替换*]
* @param [type] $a1 [最小高度]
* @param [type] $a2 [最大高度]
* @param [type] $b1 [最小宽度]
* @param [type] $b2 [最大宽度]
* @return [type] [description]
*/
function rect($a1,$a2,$b1,$b2){ foreach($this->data as $k1=>$line){ if($k1<$a1 or $k1>$a2) continue; foreach($line as $k2=>$char){
if($k2<$b1 or $k2>$b2) continue;
//使用-替换*
$this->data[$k1][$k2] = '-';
}
}
} /**
* [输出到浏览器]
* @return [type] [description]
*/
function draw(){ foreach($this->data as $line){
foreach($line as $char){
echo $char;
}
echo "<br>";
}
} }

  在入口文件index.php实例化Canvas对象,进行绘图  

 <?php

 define('BASE_PATH',__DIR__);
// echo BASE_PATH;
require './IMooc/Framework.php';
spl_autoload_register('\IMooc\Framework::autoload'); $canvas1 = new IMooc\Canvas();
$canvas1->init(); $canvas2 = new IMooc\Canvas();
$canvas2->init(); $canvas1->rect(3,6,4,12);
$canvas1->draw(); $canvas2->rect(2,6,4,8);
//$canvas2->draw();
output输出结果
********************
********************
********************
****---------*******
****---------*******
****---------*******
****---------*******
********************
********************
******************** 

 创建两个Canvas对象,如果Canvas初始化工作很多,很复杂,实例化对象对资源消耗就比较严重,这时可以考虑使用原型模式进行优化

<?php

define('BASE_PATH',__DIR__);
// echo BASE_PATH;
require './IMooc/Framework.php';
spl_autoload_register('\IMooc\Framework::autoload'); $prototype = new IMooc\Canvas();
$prototype->init(); //使用clone避免每次直接进行初始化操作
$canvas1 = clone $prototype;
$canvas1->rect(3,6,4,12);
$canvas1->draw(); $canvas2 = clone $prototype;
$canvas2->rect(3,6,4,12);
$canvas2->draw();

  

  

PHP设计模式笔记八:原型模式 -- Rango韩老师 http://www.imooc.com/learn/236的更多相关文章

  1. PHP设计模式笔记七:观察者模式 -- Rango韩老师 http://www.imooc.com/learn/236

    观察者模式 概述: 1.观察者模式(Observer),当一个对象状态发生改变时,依赖他的对象全部会收到通知,并自动更新 2.场景:一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在事件的代 ...

  2. PHP设计模式笔记四:适配器模式 -- Rango韩老师 http://www.imooc.com/learn/236

    适配器模式 1.适配器模式,可以将截然不同的函数接口封装成统一的API 2.实际应用举例,PHP的数据库操作有mysql.mysqli.pdo三种,可以用适配器模式统一成一致,类似的场景还有cache ...

  3. PHP设计模式笔记二:面向对象 -- Rango韩老师 http://www.imooc.com/learn/236

    SPL标准库的使用 SPL是用于解决典型问题(standard problems)的一组接口与类的集合. 1.SPL提供了很多数据结构类,如SplStack.SqlQueue.SqlHeap.SplF ...

  4. PHP设计模式笔记一:准备工作 -- Rango韩老师 http://www.imooc.com/learn/236

    一.编程字体选择 1.选择等宽字体 包括Courier New ,Consolas,Source Code Pro(推荐) 2.环境搭建(建议easyPHP) 二.开发符合PSR规范的基础框架 PSR ...

  5. PHP设计模式笔记九:装饰器模式 -- Rango韩老师 http://www.imooc.com/learn/236

    装饰器模式(Decorator) 概述 1.装饰器模式可以动态地添加修改类的功能 2.一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法 3. ...

  6. PHP设计模式笔记六:数据对象映射模式 -- Rango韩老师 http://www.imooc.com/learn/236

    数据对象映射模式 1.数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作 2.在代码中实现数据对象映射模式,我们将实现一个ORM类,将复杂的SQL语句映射成对象属性 ...

  7. PHP设计模式笔记五:策略模式 -- Rango韩老师 http://www.imooc.com/learn/236

    策略模式 1.概述:策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式称为策略模式 例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不 ...

  8. PHP设计模式笔记三:三种基本设计模式(工厂模式、单例模式、注册树模式) -- Rango韩老师 http://www.imooc.com/learn/236

    一.工厂设计模式 index.php $db = IMooc\Factory::createDatabase(); 使用工厂类的静态方法直接创建一个dababase对象,当类名发生修改时,在工厂里修改 ...

  9. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

随机推荐

  1. Android 使用ViewPager实现左右循环滑动图片

    ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1.    首先看一 ...

  2. Linux内核ROP学习

    0x00 前言 1.SMEP(Supervisor Mode Execution Protection):一种减缓内核利用的cpu策略,禁止内核态到用户态内存页的代码执行(32位的addresses ...

  3. 使用VS Code开发AngularJS 2 第一个应用程序

    使用VS Code开发AngularJS 2 第一个应用程序 目录 运行环境 创建项目 安装依赖包 创建TypeScript应用程序 配置应用程序 运行应用程序 运行环境 运行环境: Windows ...

  4. Android(工具・集成)

    ■ NDK Android从始(2009)至终是支持JNI的. 只不过一开始没有NDK.需要自己安装交叉编译器创建so,然后放到assert之类捆绑so发布. 有了NDK.有了什么? libc lib ...

  5. Android-兼容问题

    兼容性问题从何而来?答:使用了低版本没有的功能,可是目标设备包括低版本. 那我们如何解决兼容性问题? 1.如果是JAVA代码 1.1 使用TargetApi(x)注解,避免Android Lint报错 ...

  6. MFC 点击改变文本 加法计时器 伸缩窗体

    1.添加所需控件,设置ID:labNum1,txtNum1.txtNum2.txtNum3.btnAdd,并将labNum1的属性Notify->true(控件在被单击或双击时可以发送消息) 2 ...

  7. Django Meta内部类选项

    http://blog.csdn.net/yelbosh/article/details/7545335

  8. 使用Hammer.js的H5页面开发DOM的一些小说法

    前几天,一个小伙伴说叫我帮他写一个移动端上的一个轮播图,个人一般是不接私活的,毕竟平时工作也是单双休,时间也不很多. 可能大部分程序员,多余的时间都是看看新闻,打游戏,或者学习新的知识,缺少运动吧. ...

  9. PHP扩展开发(4) - 多类扩展

    由于函数和单类的扩展,网上一搜一大片,这里就不再叙述了. 这里特别感谢laruence(鸟哥)开源的yaf扩展,解决困扰我多时的多类问题,还在看他的代码学习中,这里是对多类写法学习的一个阶段总结.   ...

  10. Sphinx编译docs文档

    在使用Python.Django的过程中,经常看到docs目录,里面存放着一些txt文本文件,也就是自带的一些帮助文档,里面有make.bat,在dos目录下直接执行make,给出的帮助是可以转换成H ...