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 が名前空間をサポートする前は少し便利でしたが、最近では静的クラスを作成するときに注意する必要があると思います。

同じことがシングルトンにも当てはまりますが、クラスのインスタンスを 1 つだけ持ちたい場合があるため、それには用途があります。この例には、接続プールやハードウェア コントローラーが含まれます。オブジェクトのインスタンスが複数あると問題が発生する可能性があるため、シングルトンを使用する十分な理由があります。しかし、必要がない場合、オブジェクトをシングルトンにすることがよくあります。その場合、グローバルを使用しているという事実を隠す方法に過ぎず、悪い習慣だと思います。

しかし、シングルトンは静的クラスではありません。これは、コンストラクターを隠し、クラスの単一インスタンスに到達するための静的メソッドを提供する単なるクラスです。これは静的クラスと似ていますが、同じではありません。

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 に答える