2014-10-15 2 views
1

다른 개체를 만들기 위해 공장 패턴을 사용하려고합니다. 그러나 공장 패턴을 통해 다른 클래스 내부의 객체를 생성하면 단단히 결합되었는지 여부는 조금 혼란 스럽습니다. 예를 들어 : 팩토리 패턴과 밀 결합을 사용합니다.

class CarFactory 
{ 
    public static function createCar($type) 
    { 
     if ($type == 'sport') { 
      return new SportCar(); 
     } elseif ($type == 'LuxuryCar' { 
      return new LuxuryCar(); 
     } 
    } 
} 

interface Vehicle 
{ 
    public function drive(); 
} 

class SportCar implements Vehicle 
{ 
    $speed = 'very fast'; 
    public function drive() 
    { 
     return ' is driving sport car'; 
    } 
} 

class LuxuryCar implements Vehicle 
{ 
    $speed = 'normal'; 
    public function drive() 
    { 
     return ' is driving luxury car'; 
    } 
} 

class DrivingApplication 
{ 
    public function __constructor($driverName, $carType) 
    { 
     $car = CarFactory::createCar($carType); //<------ HERE// 
     echo $driverName . $car->drive(); 
    } 
} 

$app = new DrivingApplication(); 

는 그래서, DrivingApplication 클래스 안에, 내가 CarFactory를 사용하여 자동차 클래스를 만들었습니다. 제 질문은 :

  • 여전히 견고한 커플 링을 가정합니까?
  • DrivingApplication 클래스 외부에 car 객체를 만들고 종속 결합을 사용하여 밀 결합을 해결해야합니까 ??
  • DrivingApplication 클래스 내에 생성 할 차 유형 만 식별 할 수 있다면 어떻게해야합니까 ??
+0

왜 'VehicleFactory'라는 공장 클래스를 호출하지 않습니까? 귀하의 질문에 대답 클래스/코드를 보지 않고 열심히. 이것은 실제로 codereview.stackexchange.com에 더 적합한 질문 일 수 있습니다. –

답변

0

글쎄, new은 어딘가이라 불려야한다. 당신은 좀 더 동적 클래스에 유형을 매핑하는 CarFactory::$classes 배열을함으로써 그것을 만드는 시도 할 수 있습니다 :

class CarFactory { 
    public static $classes = []; 
    public static function create ($type) { 
     $class = static::$classes[$type]; 
     return new $class(); 
    } 
} 

은 그럼 당신은 런타임 중에 자동차 종류를 추가 할 수 있습니다.

CarFactory::$classes['foo'] = 'FooClass'; 
$foo = CarFactory::create('foo'); 
관련 문제