注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

php开发lamp

《西安--木木》-经历丰富了生活。 架构师QQ群: 246695517

 
 
 

日志

 
 

Flyweight享元模式  

2018-03-12 14:31:11|  分类: 设计模式--php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


<?php

/**
* Flyweight享元模式
*/
//围棋棋子类:抽象享元类
abstract class IgoChessman
{
public abstract function getColor();

public function display(Coordinates $coord)
{
print("棋子颜色:" . $this->getColor() . ",棋子位置:" . $coord->getX(). "," . $coord->getY().'<br/>');
}
}

//黑色棋子类:具体享元类
class BlackIgoChessman extends IgoChessman
{
public function getColor()
{
return "黑色";
}
}

//白色棋子类:具体享元类
class WhiteIgoChessman extends IgoChessman
{
public function getColor()
{
return "白色";
}
}

//围棋棋子工厂类:享元工厂类,使用单例模式进行设计
class IgoChessmanFactory
{
private static $instance = null;
private static $ht=array(); //使用Hashtable来存储享元对象,充当享元池

private function __construct()
{
$black = new BlackIgoChessman();
$white = new WhiteIgoChessman();
self::$ht =array_merge(array("b"=> $black),array("w"=> $white));
}

//返回享元工厂类的唯一实例
public static function getInstance()
{
if (self::$instance == null) {
self::$instance = new self();
}
return self::$instance;
}

//通过key来获取存储在Hashtable中的享元对象
public static function getIgoChessman($color)
{
return self::$ht[$color];
}
}

//坐标类:外部状态类
class Coordinates
{
private $x;
private $y;

public function __construct($x, $y)
{
$this->x = $x;
$this->y = $y;
}

public function getX()
{
return $this->x;
}

public function setX($x)
{
$this->x = $x;
}

public function getY()
{
return $this->y;
}

public function setY($y)
{
$this->y = $y;
}
}


//客户端测试代码修改如下:


//获取享元工厂对象
$factory = IgoChessmanFactory::getInstance();
//通过享元工厂获取三颗黑子
$black1 = $factory::getIgoChessman("b");
$black2 = $factory::getIgoChessman("b");
$black3 = $factory::getIgoChessman("b");
$black_str = $black1 === $black2?true:false;
print("判断两颗黑子是否相同:" .$black_str.'<br />');

//通过享元工厂获取两颗白子
$white1 = $factory::getIgoChessman("w");
$white2 = $factory::getIgoChessman("w");
$white_str = $white1 === $white2?true:false;
print("判断两颗白子是否相同:" . ($white_str).'<br />');



//显示棋子,同时设置棋子的坐标位置
$black1->display(new Coordinates(1, 2));
$black2->display(new Coordinates(3, 4));
$black3->display(new Coordinates(1, 3));
$white1->display(new Coordinates(2, 5));
$white2->display(new Coordinates(2, 4));



  评论这张
 
阅读(19)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018