1

我经常看到这些课程,但我不会在我的项目中使用它们。我从这里检查了这些设计模式 ,我注意到它们使用静态类

从上面的页面,示例代码:

class AutomobileFactory
{
    public static function create($make, $model)
    {
        return new Automobile($make, $model);
    }
}

或单例模式:

  public static function getInstance()
    {
        static $instance = null;
        if (null === $instance) {
            $instance = new static();
        }

        return $instance;
    }
4

3 回答 3

1

第一个例子是工厂类。工厂是一段代码,可帮助您创建和配置对象。工厂可以是函数或方法、静态类或实例化类。通常不需要实例化工厂,因此通常使用静态类。但我认为工厂也可以被实例化。这样做允许您配置或扩展工厂,因此它为您提供了比拥有单个静态工厂方法更大的灵活性。

另外,我认为在大多数情况下,静态类只是一个借口。人们通常倾向于将全局函数或变量提升为静态类以制作“干净”的代码,但它几乎没有改进。在 PHP 支持命名空间之前它有点用处,但现在,我认为在创建静态类时应该小心。

这同样适用于单例,尽管它有它的用途,因为在某些情况下,您只想拥有一个类的一个实例。这方面的示例包括连接池或硬件控制器。拥有某个对象的多个实例可能会导致问题,因此这是使用单例的一个很好的理由。但是人们经常在不需要时将对象设为单例。在这种情况下,我认为这只是一种隐藏您正在使用全局变量的事实的方法,这是一种不好的做法。

但是单例不是静态类。它只是一个隐藏其构造函数并提供静态方法来访问该类的单个实例的类。它与静态类相似,但又不同。

我可以推荐阅读Head First Design Patterns。它以一种有趣且易于理解的方式解释了这两种模式(以及更多模式)。代码示例倾向于 Java,但这几乎不是问题。

于 2013-07-30T14:29:27.967 回答
1

我建议您首先阅读如何不使用静态来杀死您的可测试性,作为我将在下面讨论的内容的介绍。

工厂的重点通常是允许对需要实例化其他对象的方法/对象进行依赖注入。例如:

public function foo() {
    $bar = new Bar;
}

正如前面链接的文章中所讨论的那样,这很糟糕。但是这个方法必须能够实例化一个Bar对象本身。然而我们仍然想要依赖注入。
进入工厂:

public function foo(BarFactory $factory) {
    $bar = $factory->create();
}

因此,static工厂是毫无意义的:

public function foo() {
    $bar = BarFactory::create();
}

在这里直接实例化几乎没有任何优势new Bar

单例是一个热门讨论的话题,并且经常不鼓励使用,原因与不鼓励使用全局对象相同。正如文章中详细讨论的那样,静态引用的单例又是不好的。

于 2013-07-30T14:30:58.680 回答
0

这些类有一定的用途。让我们以记录器为例。

    class Logger() {
        private __construct() {}

      public static function getInstance()
        {
            static $instance = null;
            if (null === $instance) {
                $instance = new static();
            }

            return $instance;
        }

    //other methods here

    }
}

现在在实例化它之后,你可以做类似的事情

Logger::log(parameters)

log该类中的方法在哪里。

这只是此类非常有用的一个示例。

于 2013-07-30T14:35:29.840 回答