避免无限制的创建对象,建立一个对象池,将可以共享的对象存起来复用。
类图
java实现
public abstract class Flyweight {
private String intrinsic;
protected final String extrinsic;
public Flyweight(String extrinsic){
this.extrinsic = extrinsic;
}
public abstract void operate();
public String getIntrinsic(){
return intrinsic;
}
public void setIntrinsic(String intrinsic){
this.intrinsic = intrinsic;
}
}
public class ConcreteFlyweight extends Flyweight {
public ConcreteFlyweight(String extrinsic) {
super(extrinsic);
}
@Override
public void operate() {
}
}
public class FlyweightFaculty {
private static HashMap<String,Flyweight> pool = new HashMap<>();
public static Flyweight getFlyweight(String extrinsic){
Flyweight flyweight = null;
if(pool.containsKey(extrinsic)){
flyweight = pool.get(extrinsic);
}else{
flyweight = new ConcreteFlyweight(extrinsic);
pool.put(extrinsic,flyweight);
}
return flyweight;
}
}
php实现
<?php
abstract class Flyweight
{
private $intrinsic;
protected $extrinsic;
public function __construct($extrinsic)
{
$this->extrinsic = $extrinsic;
}
public abstract function operate();
public function getIntrinsic()
{
return $this->intrinsic;
}
public function setIntrinsic($intrinsic)
{
$this->intrinsic = $intrinsic;
}
}
class ConcreteFlyweight extends Flyweight
{
public function __construct($extrinsic)
{
parent::__construct($extrinsic);
}
public function operate()
{
}
}
class FlyweghtFaculty
{
public static $pool = array();
public function getFlyweight($key)
{
if(array_key_exists($key,FlyweghtFaculty::$pool))
{
$flyWeight = FlyweghtFaculty::$pool[$key];
echo 'cache';
}
else
{
$flyWeight = new ConcreteFlyweight($key);
FlyweghtFaculty::$pool[$key] = $flyWeight;
echo 'create';
}
return $flyWeight;
}
}
$faculty = new FlyweghtFaculty();
$faculty->getFlyweight('111');
$faculty->getFlyweight('111');