2010-12-01 3 views
0

Прошу прощения, я не мог придумать более описательное название. Моя проблема в следующем. Предположим, что у вас есть два класса A и B, и вы знаете, что иногда может случиться, что некоторый код пытается создать экземпляр объекта типа A, когда то, что на самом деле необходимо, является объектом типа B. Дело в том, что код для решения, какой один из них является правильным объектом, естественно принадлежит классу A, а не клиенту.Позволяя объекту решить свой класс

В JavaScript (ок, JS классы не, но это делает очко), вы можете просто сделать

function A() { 
    if(some_condition) { 
     return new B(); 
    } 
    //else we proceed to customize and return our object 
} 

Я хочу сделать что-то подобное в PHP. Самое лучшее, что я могу придумать это

class A { 
    private function __construct() { 
     //whatever you need to do 
    } 

    public static function getInstance() { 
     if(some_condition) { 
      return new B(); 
     } 
     else { 
      return new A(); 
     } 
    } 
} 

Проблема заключается в том, что клиентский код всегда будет знать, что А является особенным, и вы должны создавать объекты со статическим методом.

Есть ли способ делегировать A выбор типа объекта для возврата в бесшовной форме?

ответ

0

К сожалению, нет, лучше я думаю, что вы можете сделать что-то вроде:

class Decider { 

    public static function decide() { 
     if(some_condition) { 
      return "A"; 
     } 
     else { 
      return "B"; 
     } 
    } 
} 

$new_class = Decider::decide(); 

$new_object = $new_class(); 

Но опять же это на самом деле не отличается, то, как вы подошли к нему. Я бы не считал это недопустимым шаблоном проектирования, хотя, тем не менее, я бы оставил его внешнему классу, чтобы сделать выбор, а затем сделать класс «А» или класс «В», приняв решение в них. В идеале ваши классы должны быть инкапсулированы таким образом, чтобы они не требовали других классов, если они не являются переменными-членами самого класса или не передаются в класс для функциональных целей.

Смежные вопросы