文章摘要
这篇文章介绍了**享元模式(Flyweight Pattern)**及其实现。文章首先定义了一个**享元接口**`Flyweight`,该接口包含一个操作方法`operation()`。接着,实现了一个`ConcreteFlyweight`类,该类继承自`Flyweight`接口,并使用一个私有属性`$state`来保持对象状态。`ConcreteFlyweight`类的`operation()`方法在实例化时会输出操作信息。 此外,文章还定义了一个**享元工厂类**`FlyweightFactory`。该类负责管理共享实例,通过一个内部数组`$flyweights`来存储不同状态的实例。当调用`getFlyweight()`方法时,如果对应状态的实例已经存在,则返回该实例;否则,创建新实例并存储在数组中。 文章最后展示了如何在客户端代码中使用`FlyweightFactory`。通过工厂类获取不同状态的实例,并调用这些实例的操作方法,实现了对象的共享使用,减少了对象的重复创建。
<?php
// 享元接口
interface Flyweight
{
public function operation();
}
// 具体享元类
class ConcreteFlyweight implements Flyweight
{
private $state;
public function __construct($state)
{
$this->state=$state;
}
public function operation()
{
echo “ConcreteFlyweight with state {$this->state} is operated.\n”;
}
}
// 享元工厂类
class FlyweightFactory
{
private $flyweights=[];
public function getFlyweight($state)
{
if (!isset($this->flyweights[$state])) {
$this->flyweights[$state]=new ConcreteFlyweight($state);
}
return $this->flyweights[$state];
}
}
// 客户端代码
$factory=new FlyweightFactory();
$flyweight1=$factory->getFlyweight(“state1”);
$flyweight1->operation();
$flyweight2=$factory->getFlyweight(“state2”);
$flyweight2->operation();
$flyweight3=$factory->getFlyweight(“state1”);
$flyweight3->operation();
// 享元接口
interface Flyweight
{
public function operation();
}
// 具体享元类
class ConcreteFlyweight implements Flyweight
{
private $state;
public function __construct($state)
{
$this->state=$state;
}
public function operation()
{
echo “ConcreteFlyweight with state {$this->state} is operated.\n”;
}
}
// 享元工厂类
class FlyweightFactory
{
private $flyweights=[];
public function getFlyweight($state)
{
if (!isset($this->flyweights[$state])) {
$this->flyweights[$state]=new ConcreteFlyweight($state);
}
return $this->flyweights[$state];
}
}
// 客户端代码
$factory=new FlyweightFactory();
$flyweight1=$factory->getFlyweight(“state1”);
$flyweight1->operation();
$flyweight2=$factory->getFlyweight(“state2”);
$flyweight2->operation();
$flyweight3=$factory->getFlyweight(“state1”);
$flyweight3->operation();
© 版权声明
文章版权归作者所有,未经允许请勿转载。



