[設計モード(作成モード)]-ファクトリモード


工場図案は設計図案の中で最も広く、最も基本的な図案である.
オブジェクトの作成の代わりにクラスを定義します.
ファクトリモードが分からない場合は、このような方法でコードを書くことが多い.(私も)
class A
{
    public function f()
    {
        return 1;
    }
}

class Test
{
    public $a;
    
    public function someThing()
    {
        $this->a = new A;
        print $this->a->f();
    }
}
上のコードに何か問題がありますか?

  • Testクラスに直接Aオブジェクトを作成すると依存関係が強化されます.
    オブジェクトの作成は、オブジェクト間の結合関係を作成します.この結合関係は、オブジェクト間の依存性をもたらします.
    (テストクラスはAクラスに依存)

  • Aクラスを変更した場合、または別のクラスに置き換えられた場合は、以前にAクラスを使用していた場所を修復する必要があります.
  • では、工場モードで上のコードを変更します.
    class A
    {
        public function f()
        {
            return 1;
        }
    }
    
    class AFactory
    {
        public static function createInstance()
        {
            return new A;
        }
    }
    
    class Test
    {
        public $a;
        
        public function someThing()
        {
            $this->a = AFactory::createInstance(); 
            print $this->a->f();
        }
    }
    上のコードから見ると,Testクラスに直接オブジェクトを作成するのではなく,他のオブジェクト(Factory)にオブジェクト(A)を作成させる.(事前に作成したオブジェクトを受信して使用するテスト)
    つまり、Factoryクラスの役割は、オブジェクトの作成操作の代わりになります.
    すると、上の最初のコードとは違って、
  • オブジェクトの作成が個々のオブジェクトに渡されるため、テストクラスとAクラス間の依存関係は弱まります.
  • Aクラスを変更したり、他のクラスに置き換えたりした場合は、Aクラスを使用する場所に触れることなくFactoryクラスを変更するだけです.
  • しかし、このパターンには欠点があります.
  • 最初はTestクラスにAオブジェクトを1つ作成するだけで、今回はもう一度Factoryを通過する必要があります.(コールの増加->パフォーマンスの問題)
  • でも上の長所を考えると... ^_^