Хоть примеров в сети немало, однако все равно я не могу понять несколько моментов.
Основной вопрос вызывает смысл всего этого. Кто знает, поясните пожалуйста на конкретных примерах кода, для чего может применяться данный паттерн, то есть какой от него толк на практике. Желательно, не таинственными фразами типа "с точки зрения банальной эрудиции ваши эмоции в данной тенденции......." (я тупой

Также, большая просьба не флудить на тему "ООП - говно".
Огромное спасибо.
Спустя 1 час, 53 минуты, 57 секунд (7.08.2011 - 09:06) Гость_lekafe написал(а):
http://ru.wikipedia.org/wiki/%D0%90%D0%B1%...%D0%B8%D1%8F%29 там есть пример, вполне понятный, как мне кажется
Спустя 9 минут, 6 секунд (7.08.2011 - 09:15) Invis1ble написал(а):
Гость_lekafe
был я там, все равно не понимаю, к сожалению....
Может кто-нибудь разжевать?
был я там, все равно не понимаю, к сожалению....
Может кто-нибудь разжевать?
Спустя 2 часа, 10 минут, 52 секунды (7.08.2011 - 11:26) Гость_lekafe написал(а):
Цитата (Invis1ble @ 7.08.2011 - 06:15) |
был я там, все равно не понимаю, к сожалению.... Может кто-нибудь разжевать? |
что именно ты не понимаешь?
Спустя 3 часа, 17 минут, 47 секунд (7.08.2011 - 14:44) Invis1ble написал(а):
Гость_lekafe
например, возьмем приведенный код:
и перепишем так:
В чем отличие, кроме колличества буков?
Т.е. до меня не доходит, зачем в первом коде все так усложняется? В чем profit?
например, возьмем приведенный код:
<?
interface GUIFactory {
public function createButton();
}
class WinFactory implements GUIFactory {
public function createButton() {
return(new WinButton());
}
}
class LinFactory implements GUIFactory {
public function createButton() {
return(new LinButton());
}
}
abstract class Button {
private $_caption;
public abstract function render();
public function getCaption(){
return $this->_caption;
}
public function setCaption($caption){
$this->_caption = $caption;
}
}
class WinButton extends Button {
public function render() {
echo "I am WinButton: ".$this->getCaption();
}
}
class LinButton extends Button {
public function render() {
echo "I am LinButton: ".$this->getCaption();
}
}
####
/**
* Класс инкапсулирует логику конструирования алгоритма создания каких либо структур
* например (GUI, алгоритмов доступа к БД, и т.д.). Класс ни чего "не знает" о платформе, на которой он работает.
*/
class Application {
public function __construct(GUIFactory $factory) {
$button = $factory->createButton();
$button->setCaption("Start");
$button->render();
}
}
/**
* Класс определяет платформу на которой работает и в соответствии от неё создаёт "класс-клиент", использующий "продукты"
* (в данном случае создание кнопок), с передаваемым параметром, определённой фабрики, в использование "клиентом".
*/
class ApplicationRunner {
public static function run() {
new Application(self::createOsSpecificFactory());
}
public static function createOsSpecificFactory() {
$sys = substr(PHP_OS, 0, 3);
if (strtoupper($sys) === 'WIN') {
return new WinFactory();
} else {
return new LinFactory();
}
}
}
ApplicationRunner::run();
и перепишем так:
abstract class Button {
private $_caption;
public abstract function render();
public function getCaption(){
return $this->_caption;
}
public function setCaption($caption){
$this->_caption = $caption;
}
}
class WinButton extends Button {
public function render() {
echo "I am WinButton: ".$this->getCaption();
}
}
class LinButton extends Button {
public function render() {
echo "I am LinButton: ".$this->getCaption();
}
}
//////////////////////////////////////
class Application {
public function __construct(Button $button) {
$button->setCaption("Start");
$button->render();
}
}
class ApplicationRunner {
public static function run() {
new Application(self::createOsSpecificButton());
}
public static function createOsSpecificButton() {
$sys = substr(PHP_OS, 0, 3);
if (strtoupper($sys) === 'WIN') {
return new WinButton();
} else {
return new LinButton();
}
}
}
ApplicationRunner::run();
В чем отличие, кроме колличества буков?
Т.е. до меня не доходит, зачем в первом коде все так усложняется? В чем profit?
Спустя 4 часа, 40 минут, 34 секунды (7.08.2011 - 19:25) Гость_lekafe написал(а):
глупый вопрос, смысл в том что в том примере у тебя была ГУИшная штука, которое позволяла бы тебе делать разносторонний интерфейс, а сейчас у тебя приложение это только кнопку и все. Ты вырыл сам себе яму, сейчас что бы создать новый объект интерфейса тебе придется итди к какому то классу за экземпляром, а при примере из вики, ты бы имел все элементы интерфейса на руках.
Спустя 11 минут, 29 секунд (7.08.2011 - 19:36) Invis1ble написал(а):
пытаюсь осмыслить.... тема незакрыта, вопросы еще будут
PS. Видимо, я неисправимый процедурщик
PS. Видимо, я неисправимый процедурщик
Спустя 6 дней, 16 часов, 25 минут, 44 секунды (14.08.2011 - 12:02) Гость_Greg1978 написал(а):
Гы
, коментарии в википедии я дописывал, подумал что бы было понятнее.
Invis1ble
Возьми и изучи Factory Method и абстрактную фабрику и увидишь
что абстрактная фабрика включает в себя ещё один класс, который скажем так зависим от каких то условий. Вот он то и создаёт (определяет) фабрику, которая является абстракцией каких либо продуктов, в свою очередь эта фабрика возвращает по заданным заранее методам (интерфейсам) уже определённые продукты. Что это даёт, мы работаем не с самими продуктами а с их абстракцией (чем то похожа на паттерн bridge).
Что делает Factory Method, паттерн определяет класс зависимый от условий и в нём определяет методы (интерфейс), в котором каждый интерфейс возвращает (НЕ АБСТРАКТНУЮ ФАБРИКУ, A КОНКРЕТНЕЙШИЙ ПРОДУКТ)
А вообще хорошо описано в книге "Приёмы объектно-ориентированного проектирования" Э.Гамма ...

Invis1ble
Возьми и изучи Factory Method и абстрактную фабрику и увидишь

Что делает Factory Method, паттерн определяет класс зависимый от условий и в нём определяет методы (интерфейс), в котором каждый интерфейс возвращает (НЕ АБСТРАКТНУЮ ФАБРИКУ, A КОНКРЕТНЕЙШИЙ ПРОДУКТ)

А вообще хорошо описано в книге "Приёмы объектно-ориентированного проектирования" Э.Гамма ...
Спустя 4 минуты, 5 секунд (14.08.2011 - 12:06) Гость_Greg1978 написал(а):
Кстати ключ к пониманию, Абстрактная фабрика это не от abstract class Factory, а от проектного назначения. Абстракция для других конкретных продуктов как в паттерне bridge.
Спустя 15 минут, 16 секунд (14.08.2011 - 12:21) Гость_Greg1978 написал(а):
Вобщем случае абстрактная фабрика инкапсулирует в себе инстанцирование СВОЕГО СЕМЕЙСТВА (РЯДА) ПРОДУКТОВ. Клиент по условию (допустим по виду ОС) инстанцирует (не конкретный продукт) а фабрику. Потом возвращает её в пользование, откуда другие клиенты могут использовать интерфейсы не обращая внимания на платформу ОС.
Спустя 4 минуты, 20 секунд (14.08.2011 - 12:25) Invis1ble написал(а):
Попозжа отпишусь, сейчас другим занят.
Спустя 1 день, 12 часов, 27 минут, 34 секунды (16.08.2011 - 00:53) blazze написал(а):
если не ленивый и действительно этим интересуешься прочти книгу Мэта Зандстры там это очень доходчиво описано.
Спустя 9 часов, 26 минут, 11 секунд (16.08.2011 - 10:19) Invis1ble написал(а):
blazze
Читаю итак.
Читаю итак.
Спустя 9 часов, 27 минут, 52 секунды (16.08.2011 - 19:47) blazze написал(а):
Invis1ble
так же ознакомься с трудом Мартина Фаулера. Архитектура корпоративных программных приложений, потом еще посмотри книгу банды четырех. так же не поленись и прочти Бадд Т.Объектно-ориентированное программирование (два тома) потом можешь с чистой душой приступать к Кнуту.
так же ознакомься с трудом Мартина Фаулера. Архитектура корпоративных программных приложений, потом еще посмотри книгу банды четырех. так же не поленись и прочти Бадд Т.Объектно-ориентированное программирование (два тома) потом можешь с чистой душой приступать к Кнуту.
Спустя 5 часов, 1 минута, 22 секунды (17.08.2011 - 00:48) Guest написал(а):
Цитата (blazze @ 16.08.2011 - 16:47) |
Invis1ble так же ознакомься с трудом Мартина Фаулера. Архитектура корпоративных программных приложений, потом еще посмотри книгу банды четырех. так же не поленись и прочти Бадд Т.Объектно-ориентированное программирование (два тома) потом можешь с чистой душой приступать к Кнуту. |
А когда ж практика то ... ?

Спустя 23 часа, 2 минуты, 54 секунды (17.08.2011 - 23:51) blazze написал(а):
Цитата (Guest @ 16.08.2011 - 21:48) | ||
А когда ж практика то ... ? ![]() |
в том то и дело что многие несутся сломя голову к практике не понимая основ программирования как такового. хотя и теория без практики не много стоит. Кстате, а касательно ооп, то даже признанные умы этого дела пользуют выше указанные книги (каталоги паттернов проектирования).
Спустя 4 минуты, 57 секунд (17.08.2011 - 23:56) neadekvat написал(а):
Цитата (blazze @ 18.08.2011 - 00:51) |
в том то и дело что многие несутся сломя голову к практике не понимая основ программирования как такового. |
А почему бы и нет?
Я помню, безумно радовался, когда сделал
$one = 1;
$two = 2;
echo $one + $two;
А уж когда я смог сделать форму на одной страница и на второй подставлять свое имя в "Привет, $name", там вообще чуть не кипятком писал.
Спустя 32 минуты, 23 секунды (18.08.2011 - 00:29) blazze написал(а):
я имел в виду не тривиальные вещи, понятное дело что на начальном этапе, читать с умным видом, любой из выше упомянутых трудов не самая лучшая затея. Многие вообще не заморачиваются и даже не спрашивают про ооп и т.д. но если человек задается подобными вопросами что такое абстрактная фабрика, чем композиция отличается от наследования, почему интерфейс класса это абсолютно не то, что обозначается словом interface, то книги упомянутые выше помогут понять все эти вопросы.
_____________
Профессиональная разработка на заказ
Я на GitHub | второй профиль