Исправьте. Использование шаблона Factory.

vvs_rostov

Новичок
Исправьте. Использование шаблона Factory.

Здравствуйте.
Захотел применить теорию паттернов. Существует задача сводящаясь к созданию форм в зависимости от модели + у одной модели формирование формы зависит от доп. параметра.
На PHP реализовал все с оглядной на литература.
Создал фабрику с статистическим методом
PHP:
class AdminFactory{
	public static function createForm($model){
		switch($model){
			case 'model1':{
				$ret = new Form1();
				break;
			}

			//.......
		}
		
	}
}
где Form1, и т.д. реализуют необходимый интерфейс (в моем случае простой getForm).
Т.к. формирование Form2, например, зависит от параметра. Я добавил в данный класс этот параметр и добавил метод set для его установки. Т.е. для получения формы Form2 я :
PHP:
$form = Factory::createForm($model); 
 $form->setId($pid);
Вариант рабочий. Но после очередного просмотра прихожу что PHP позволяет мне это, т.к. не является строго типизированным. По сути $form - переменная реализующая интерфейс с единственным методом getForm(). И в Java такое бы не прошло , например. Как элегантно решать даную проблему?
Спасибо.

-~{}~ 12.10.08 17:43:

P.S.
На ум приходит заменить интерфейс, котрый должен реализовывать каждый класс форм (абстрактным классом с абстрактным методоми getForm и пустым методом setId(). ) И в соответвующем классе пустой метод переопределить , в других - оставить ве как есть. Но по моему это не особо привлекательное (а значит и практичное - часто натыкаюсь что красота кода соответвует практичности). Хотелось бы получить какие-то подсказки.
 

fixxxer

К.О.
Партнер клуба
а какой в этом смысл, городить свитчи такие?

уж всяко проще и удобнее сразу new form писать чем по каждой фигне править свитч который вырастет на стопицот страниц

я понимаю например, если чота типа
PHP:
static function createForm($model) {
   $form_class = 'Form' . $model->name;
   if (!class_exists($form_class)) throw new Exception('Oops...');
   return new $form_class($model);
}
тогда еще проглядывается смысл :)

-~{}~ 12.10.08 17:47:

>>И в Java такое бы не прошло , например

на ассемблере тоже, и что
 

vvs_rostov

Новичок
Ага. Т.е. принять стандарт именования и использовать такую конфигурацию. Хорошо. Возьму на заметку. Спасибо. Вопрос актуален.
 

fixxxer

К.О.
Партнер клуба
ну и кстати ты прежде чем про паттерны то читать, почитай про ооп вообще. только не всякую синтаксическую жвачку а чонить из района всяких smalltalk-ов. я правда конкретно ничего не посоветую, сам не читал ;) но ты как то странно все делаешь, через публикацию свойств (setId итд), это конечно все будет нормально работать, и я бы ничего и не сказал если бы разговор не шел о концептуальной правильности =) ну так вот если мы все такие объектные то по хорошему объекты должны меняться объектами, точнее указателями на них (ну или на самих себя) и дергать методы, а не передавать друг другу свои свойства.
 

vvs_rostov

Новичок
>> на ассемблере тоже, и что
дело же не в языках. А в том, что по логике я объявил интерфейс с одним методом - им и должен пользоваться - не ошибусь, если это один из базовых принципов ООП?

Банальность: Я учусь. И хотелось бы в таких моментах приучать себя писать качественно. Обратился сюда за помощью.
 

dimagolov

Новичок
vvs_rostov, о каких интерфейсах идер речь, если мы не видим декларации класса Form1 ?
 

vvs_rostov

Новичок
dimagolov,

не совсем понял суть вопроса. Интерфейс в данной реализации один (из принципа паттерна каждый класс Form1,... должен его реализовывать). В сообщении я указал:
...где Form1, и т.д. реализуют необходимый интерфейс (в моем случае простой getForm)....
Т.е. в каждом классе есть публичный метод getForm. А в Form2 я добавил дополнительный метод setId (соответвенно и private поле id). Вообщем-то это я указал выше. А непосредственно код посчитал ненужным, разве он интересен? Привожу...
PHP:
class Form1 implements iForm{
	public function getForm(){
		....
	}
}
}
class Form2 implements iForm{
	private $id;
	public function getForm(){
		....
	}
	public function setId($id){
	 ....	
	}
}
 

fixxxer

К.О.
Партнер клуба
а не лучше ли будет если form2 примет в конструкторе инстанс модели и сам возьмет оттуда id?
 

vvs_rostov

Новичок
К сожалению, нет возможности получить параметр $id с помощью параметра $model.
 

fixxxer

К.О.
Партнер клуба
ээ (только заметил) у тебя в $model строка чтоли? а как так получилось?

вообще, не знаю что тебе посоветовать не видя кода целиком.
 

vvs_rostov

Новичок
>> ээ (только заметил) у тебя в $model строка чтоли? а как так получилось?
Это имя ORM модели. Возможно стило назвать .._name.

По поводу кода понял. Но хотелось бы шаблонное решение, малозависещее от конкретного кода. Из исходных данных - созданий n-однотипных объектов , один из которых зависит от дополнительного параметра.
 
Сверху