首页 > 解决方案 > 这种“模式”有名称吗?

问题描述

我最近遇到了一种情况,通过包装类的工厂来创建类的延迟加载版本很有用。

我想做一些研究,以找出在我过于依赖它之前是否有任何我没有想到的问题,但我不知道该寻找什么。

编辑:在我的情况下,它涉及创建 cookie 和会话文件,在验证用户的凭据之前我不想这样做。

interface FooInterface
{
    public function bar();
}

class Foo implements FooInterface
{
    public function bar()
    {
        ...
    }
}

interface FooFactoryInterface
{
    public function getFoo():FooInterface;
}

class FooFactory
{
    public function getFoo():FooInterface
    {
        return new Foo(...);
    }
}

class LazyFoo implements FooInterface
{
    protected
        $foo=null,
        $factory;
    public function __construct(FooFactoryInterface $factory)
    {
        $this->factory=$factory;
    }
    public function bar()
    {
        if($this->foo===null) $this->foo=$this->factory->getFoo();
        return $this->foo->bar();
    }
}

标签: phpdesign-patterns

解决方案


这被称为代理模式,再加上抽象工厂模式,因为这个特定代理的目的是通过延迟初始化来延迟实例化本身。我怀疑这种组合是否足够普遍以至于有自己的名字。通常通过简单地延迟对工厂方法本身的调用来解决问题,在实际使用对象的代码中进行延迟初始化。


推荐阅读