GOF - Abstract factory


Abstract factory
抽象ファクトリモードは恥ずかしい概念であり,以前に知られていたモードファクトリメソッドモードとは異なる.
factory method patternで強調されている抽象化概念はAbstract(抽象)factory pattern名に含まれている.
抽象画!本当に重要です.
抽象化の定義を見てみましょう.
抽象は物事を正確に理解するために、物事が持つ各方面の中で、ある方面だけを選んで捕まえる.
私たちは本当に抽象画をよく考えましょう.
まず言語で現実世界を説明する.
現実の例
今、この現実を言語で抽象化してみましょう.
私たちの団地には自動車工場が2つある.
韓国自動車工場、アメリカ自動車工場(工場の共通点)
この2つの工場はタイヤとドアを製造している.(共通点)
韓国タイヤ、アメリカタイヤ(タイヤの共通点)(韓国とアメリカの特殊性)
韓国門、米国門(門の共通点)(韓国と米国の特殊性)
韓国製品は韓国方式で組み立てられ、米国製品は米国方式で組み立てられる.(組み立ての共通点)(韓国とアメリカの特殊性)
しかし、タイヤとドアの組み立て方は違います.(特殊性は、ここでは違うechoゲートしか試しません)
共通点は抽象類に現れる.
特殊性はサブクラスに現れる
抽象
まず二つの工場の共通点を抽象化する.
抽象化学工場:タイヤを作り、ドアを作る.
<?php
// 추상 클래스
abstract class factory
{
    abstract public function createTire();
    abstract public function createDoor();
}
実装コードは、各異なる工場にあります.
そしてタイヤの共通点(組み立てた)を抽象化しましょう.
<?php
class abstract TireProduct
{
    abstract public function makeAssemble(); // 부품은 조립된다.
}
次に,反語を抽象化する.
<?php
class abstract DoorProduct
{
    abstract public function makeAssemble(); // 부품은 조립된다.
}
私たちはすべての共通点を上層部に抽象化し、整理しました.
現在,詳細な特殊性はサブクラスに現れる.
専門化
韓国の工場を専門化する.
<?php
// 한국 공장
class KoreaFactory extends Factory
{
    public function createTire() // 오버라이딩
    {
    	return new KoreaTireProduct;
    }
    
    public function createDoor() // 오버라이딩
    {
    	return new KoreaDoorProduct;
    }
}
このように、韓国の工場は韓国製の製品しか生産していない.
アメリカの工場も特殊化しなければならない.
<?php
// 미국 공장
class StateFactory extends Factory
{
    public function createTire()
    {
    	return new StateTireProduct;
    }
    
    public function createDoor()
    {
    	return new StateDoorProduct;
    }
}
この2つの工場はabstractclass factoryを継承し、同じコマンドを強制的に使用します!
韓国の工場と米国の工場に「タイヤ製造」命令を下したが、結果は違った.共通の命令には特殊性がある.
タイヤとドアを専門化しましょう
<?php
class KoreaTireProduct extends TireProduct
{
    public function makeAssemble()
    {
    	echo"한국형 타이어 조립!"; //특수화
    }
}

class StateTireProduct extends TireProduct
{
    public function makeAssemble()
    {
    	echo"미국형 타이어 조립!"; //특수화
    }
}

class KoreaDoorProduct extends DoorProduct
{
    public function makeAssemble()
    {
    	echo"한국형 문 조립!";
    }
}

class StateDoorProduct extends StateProduct
{
    public function makeAssemble()
    {
    	echo"미국형 문 조립!";
    }
}
実行コード
実装コードが作成されました.
実行コードを作成します.
<?php
// 추상 팩토리 및 그룹 정의
require "Factory.php";
require "KoreaFactory.php";
require "StateFactory.php";

require "TireProduct.php";
require "DoorProduct.php";

require "KoreaTireProduct.php";
require "KoreaDoorProduct.php";

require "StateTireProduct.php";
require "StateDoorProduct.php";

// 한국 공장
$korea = new KoreaFactory;
$ko_tire = $korea->createTire();
$ko_door = $korea->createDoor();

$ko_tire->makeAssemble();
$ko_door->makeAssemble();

//미국 공장
$state = new StateFactory;
$us_tire = $state->createTire();
$us_door = $state->createDoor();

$us_tire->makeAssemble();
$us_door->makeAssemble();
n/a.結論
実際、モデルはアイデア、アイデアを実現することであり、モデルに従って考え、アイデアを提出することではありません.
今回、私たちはいくつかの共通点を発見し抽象化しました.
韓国と米国によって違いを見つけ、専門化した(韓国工場、米国工場、韓国サードパーティ製品、米国サードパーティ製品、韓国DOOR製品、米国サードパーティ製品).
仕事の名前は同じですが、行動の仕方を変えることができます.
factory法の拡張概念には新鮮な点はない.
私たちは私たちが望んでいる抽象化さえすればいいです.
共通点をつかみ、普及することが大切です.