螃蟹学PHP设计模式之原型模式

12.原型模式

今天螃蟹来学这个原型模式,越到后面感觉还是有些费力理解,可能螃蟹的OOP思想还不是很成熟。原型模式应用还是比较多的,螃蟹还是用比喻来说明。你去服装店买衣服,发现同一款式的衣服有多种尺寸和颜色,导购介绍的时候这些衣服相同的部分肯定只介绍一次就够了,不同的部分才会着重介绍。原型模式,其实螃蟹的理解就是对象克隆,有时候业务里面需要由一个对象派生出其他对象,其他对象可能有些地方不太一样,那么通过对象克隆,不仅保证对象属性一样,而且避免繁琐的对象实例化和数据库查询。

参考项目模块:商品信息模块

螃蟹之前做一个电子商务项目时就遇到做商品信息的存储的问题,因为和团购类似,商品属性动态增删使用属性表和属性模板表解决了。现在想想,淘宝京东的很多商品,都有不同的颜色和不同的套餐等,这个实现起来还是比较麻烦。现在看到原型模式,螃蟹就来试试看。

商品基础对象:Goods.class.php

<?php 
class Goods{
	public $title = '';
	public $price = '';
	
	public function __construct($goods){
		$this->title = $goods['title'];
	}
	
}

?>



商品 对象拓展:Goods.ext.php
<?php 
require('Goods.class.php');

class GoodsExt extends Goods{
	public $color = '';
	public function __construct($goods){
		parent::__construct($goods);
		$this->color = $goods['color'];
		$this->price = $goods['price'];
	}

	//创建动作
	public function buy(){
		echo '您购买的<b>'.$this->title.'</b>  '.$this->color.'色     价格'.$this->price.'<br>';
	}
}
?>



测试类:TestProto.php
<?php 
require('Goods.ext.php');

//模拟商品
$goods = array('title'=>'正品国产宝马','color'=>'黑','price'=>1390);
//拓展属性
$goods_ext = array(0=>array('color'=>'红','price'=>1360),1=>array('color'=>'白','price'=>1420));

$goodsobj = new GoodsExt($goods);

echo '<h3>默认款式:</h3>';
$goodsobj->buy();
echo '<h3>其他款式:</h3>';
foreach ($goods_ext as $ext){
	$goods_select = clone $goodsobj;
	$goods_select->color = $ext['color'];
	$goods_select->price = $ext['price'];
	$goods_select->buy();
}
?>



运行结果:
默认款式:

您购买的正品国产宝马 黑色 价格1390
其他款式:

您购买的正品国产宝马 红色 价格1360
您购买的正品国产宝马 白色 价格1420



螃蟹发现这个原型模式就是对象克隆,用起来也很方便,螃蟹下去慢慢消化了。

你可能感兴趣的:(设计模式,PHP,原型模式)