PHP中的工厂模式和原型模式怎么实现
admin
2023-07-29 00:40:07
0

上代码

_name = $name;
		}

		public function setName($name){
			$this->_name = $name;
		}

		public function shallowCopy(){
			//在php语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。
			//如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可用于修改属性的值
			//你要先new对象才能clone,一个是实例化,一个是克隆
			//对象的复制是通过关键字 clone 来实现的。用 clone 克隆出来的对象与原对象没有任何关系,它是把原来的对象从当前的位置重新复制了一份,也就是相当于在内存中新开辟了一块空间
			return clone $this;
		}

		public function deepCopy(){
			//序列化深拷贝:利用序列化来做深拷贝,把对象写到流里的过程是序列化的过程,这一过程称为“冷冻”或“腌咸菜”,反序列化对象的过程叫做“解冻”或“回鲜”。这种深复制比较简单
			//当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。
			//但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。 //base64_encode(gzcompress(serialize($obj)));序列化
			//unserialize(gzuncompress(base64_decode($txt)));反序列化

			$serialize_obj = serialize($this);
			$clone_obj = unserialize($serialize_obj);
			return $clone_obj;
		}
		public function getName(){
			return $this->_name;
		}
	}


//上面的原型基本上就写完了

	class Demo{
		public $string;
	}
	class UsePrototype{
		public function shallow(){
			$demo = new Demo();
			$demo->string = "susan";
			//新建
			$object_shallow_first = new ConcretePrototype($demo);
			//浅复制
			$object_shallow_second = $object_shallow_first->shallowCopy();
			//之下代码可以删除
			echo '新对象:
'; var_dump($object_shallow_first->getName());          echo '浅复制的对象
';          var_dump($object_shallow_second->getName());          echo '
';          $demo->string = "jack";                   echo '我改变新建的对象属性:
';          var_dump($object_shallow_first->getName());          echo '浅复制是同一块内存,受影响
';          var_dump($object_shallow_second->getName());          echo '
'; } public function deep(){ //新建对象,构造函数没参数就不用带括号 $demo = new Demo; $demo->string = "Siri"; //新建 $object_shallow_first = new ConcretePrototype($demo); //浅复制 $object_shallow_second = $object_shallow_first->deepCopy(); //之下代码可以删除 echo '新对象:
'; var_dump($object_shallow_first->getName());          echo '深复制的对象
';          var_dump($object_shallow_second->getName());          echo '
';          $demo->string = "jack";                   echo '我改变新建的对象属性:
';          var_dump($object_shallow_first->getName());          echo '深复制是完全新的对象,不受影响
';          var_dump($object_shallow_second->getName());          echo '
'; } } //调用 $up = new UsePrototype; $up->shallow(); echo '
'; $up->deep(); //原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是用对象内部提供的克隆方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂方法模式与抽象工厂都是通过工厂封装具体的 new 操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景,可能使用原型模式更简单、效率更高: //如果说我们的对象类型不是刚开始就能确定,而是在运行时确定的话,那么我们通过这个类型的对象克隆出一个新的类型更容易。 //有的时候我们可能在实际的项目中需要一个对象在某个状态下的副本,这个前提很重要,这点怎么理解呢,例如有的时候我们需要对比一个对象经过处理后的状态和处理前的状态是否发生过改变,可能我们就需要在执行某段处理之前,克隆这个对象此时状态的副本,然后等执行后的状态进行相应的对比,这样的应用在项目中也是经常会出现的。 //当我们处理的对象比较简单,并且对象之间的区别很小,可能只是很固定的几个属性不同的时候,使用原型模式更合适。 ?>

相关内容

热门资讯

游泳运动员王子铭构成兴奋剂违规 据中国反兴奋剂中心网站消息,近期,反兴奋剂中心实施的兴奋剂检查、调查中,下列运动员构成兴奋剂违规,现...
日本防相:将加快拦截无人机部署 据凤凰卫视报道,日本防卫大臣小泉进次郎7月3日在记者会上表示,无人机已改变现代战争模式,日本将加快建...
从保守派宠儿到MAGA公敌,她... ·艾米·康尼·巴雷特。(美国全国公共广播电台)当地时间6月30日,美国最高法院以6比3的票数推翻了特...
海南迎战台风“美莎克”登陆:环... 极目新闻记者 王灿根据海南省气象局预报,今年第10号台风“美莎克”(热带风暴级)预计7月3日下午在海...
市民代表走进上海人大,外卖小哥... 澎湃新闻记者 李佳蔚“原来外卖小哥的声音也会被倾听、被认可、被采纳,小人物也能影响城市决策。”在上海...
马桶盖旧的螺栓怎么取下来 马桶盖旧的螺栓可能会因为生锈、腐蚀或其他原因而难以取下。以下是一些可能有用的方法:- 使用扳手或钳子...
不铲腻子旧墙翻新一定要刷墙固吗 一般来说,旧墙翻新都会把原来的腻子铲除掉,重新清理打磨,再刮腻子,再粉刷,这样比较安全。如果不铲除腻...
旧马桶拆除重新安装 方法:安装时应先把地面下水管拿出来,看管内有没有杂物,将管口周边清理干净,且装置马桶的地面一定要坚固...
马桶冻裂是不是质量问题 马桶冻裂是不是质量问题:对于马桶是否会因为天气原因出现破裂现象,不一定是质量的问题,坐厕马桶水箱或底...
空调安装方法及注意事项 空调是现代家庭中的必备电器之一,夏季时节使用空调能让室内温度保持舒适,更能带来舒适的生活体验。但是,...