Фабричный метод подразумевает, что дочерние классы должны наследоваться от Creator и реализовывать метод создания сущности. На первой диаграмме, связанной с фабричным методом, видно, что должно быть два класса: CellPhoneCreator и SmartPhoneCreator. Вместо этого дальше в видео, создается просто класс с двумя методами, которые создают сущности CellPhone и SmartPhone.
Очень доходчиво объясняешь. Спасибо большое. От себя добавил бы - вместе с паттернами надо объяснять принцип ООП (интерфейсы, полиморфизм и тд). На своём опыте понял, что изначально у меня было о последнем неверное представление. Я недогонял "за каким" нужны интерфейсы и абстрактные классы, если их приходится переписывать. Казалось, что это тупое наследования для расширения родительного класса. С шаблонами впервые столкнулся в книге Зандстра (вроде так зовут автора) и для меня это было каким-то космосом. Первый вопрос "это ещё что и нафиг оно нужно?" :) И только позже, столкнувшись с расширением своих приложений, дошло, что у меня что-то не так с архитектурой и, чтоб добавить что-то новое, надо половину переписывать. Так же надо объяснять простыми словами - какие задачи решает тот или иной шаблон. Иначе нифига не ясно.
Больше всего мне "нравится", когда называют одним и тем же словом разные Методы ( function fly() в классе Duck и вызов Метода ->fly()...). По мне так Метод лучше назвать type_of_fly(), поскольку в него передается создание экземпляра конкретного класса И вызов метода fly(). Попробуйте после $this->flyBehavior->fly(); добавить $this->fly(); (55:47)
Если че, ожидал увидеть такое: class Singletone { private static $inst = null; private function __construct() { self::$inst = $this; } public static function shared() { return self::$inst ?? new static(); } } class SomeClassA extends Singletone { public function say() { echo "Say A "; } } class SomeClassB extends Singletone { public function say() { echo "Say B "; } }
@@theice-r1o я спустя некоторое время вспомнил ещё круче способ. Через кортежи: trait SingletonTrait { private static $instance; public static function getInstance() { if (empty(self::$instance)) self::$instance = new static(); return self::$instance; } private function __construct() { } private function __clone() { } private function __wakeup() { } } И можно будет оставить наследование для чего то более полезного ;)
По мне пример стратегии , неверен , Стратегия это поведенческий паттерн , а значит поле $flyBehavior должно быть или публичным , или к нему надо ставить сеттер дабы была возможность его изменить из вне , интерфейс крайне неудачный , если реализация интерфейса должна подразумевать поведение объекта , почему бы не назвать к примеру IMovable c одним методом move() . Далле уже в стратегии мы просто делаем обкаст к интерфейсу а не к классу реализующим данный интерфейс к примеру class Animal{ public $movable; public function __construct(IMovable $movable) { $this->movable = $movable } public function move() { $this->movable->move() } } class Duck extends Animal{} $animal = new Duck(new Fly()); $animal->move(); $animal->movable = new Run(); $animal->move(); В вашем примере просматривается зависимость в объектах и для создания других типов поведения вы будете вынуждены плодить интерфейсы для каждого отдельного типа поведения, это немного сбивает с толку
слушать нереально. "то,что есть,что именно,например...ээээм...ну когда класс реализует функцию...эээм...это и есть паттерн стратегии" - после этого я дропнул просмотр. если смотреть без звука,то шанс есть,но,как мне кажется,есть неточности в реализации. поэтому дизлайк.
40 минут убито зря и никакого доверия и уважения к автору нет, он не понимает что такое интерфейс и что такое шаблон и зачем он нужен, какой от него реальный профит
🔥Промокод на скидку 15% на все курсы ITVDN - 4TH-cam
Материалы вебинара - itvdn.com/ru/webinars/description/design-patterns-for-beginners-php?
Фабричный метод подразумевает, что дочерние классы должны наследоваться от Creator и реализовывать метод создания сущности. На первой диаграмме, связанной с фабричным методом, видно, что должно быть два класса: CellPhoneCreator и SmartPhoneCreator. Вместо этого дальше в видео, создается просто класс с двумя методами, которые создают сущности CellPhone и SmartPhone.
Очень доходчиво объясняешь. Спасибо большое.
От себя добавил бы - вместе с паттернами надо объяснять принцип ООП (интерфейсы, полиморфизм и тд). На своём опыте понял, что изначально у меня было о последнем неверное представление. Я недогонял "за каким" нужны интерфейсы и абстрактные классы, если их приходится переписывать. Казалось, что это тупое наследования для расширения родительного класса.
С шаблонами впервые столкнулся в книге Зандстра (вроде так зовут автора) и для меня это было каким-то космосом. Первый вопрос "это ещё что и нафиг оно нужно?" :)
И только позже, столкнувшись с расширением своих приложений, дошло, что у меня что-то не так с архитектурой и, чтоб добавить что-то новое, надо половину переписывать.
Так же надо объяснять простыми словами - какие задачи решает тот или иной шаблон. Иначе нифига не ясно.
Чувак, проставь, пожалуйста, таймкоды.
Больше всего мне "нравится", когда называют одним и тем же словом разные Методы ( function fly() в классе Duck и вызов Метода ->fly()...). По мне так Метод лучше назвать type_of_fly(), поскольку в него передается создание экземпляра конкретного класса И вызов метода fly(). Попробуйте после $this->flyBehavior->fly(); добавить $this->fly(); (55:47)
Ох уж этот snake case...
Почему синглттон не через статик метод и приватный конструктор?
Если че, ожидал увидеть такое:
class Singletone {
private static $inst = null;
private function __construct() {
self::$inst = $this;
}
public static function shared() {
return self::$inst ?? new static();
}
}
class SomeClassA extends Singletone {
public function say() { echo "Say A
"; }
}
class SomeClassB extends Singletone {
public function say() { echo "Say B
"; }
}
SomeClassA::shared()->say();
SomeClassB::shared()->say();
var_dump(get_class( SomeClassA::shared()));
var_dump(get_class( SomeClassB::shared()));
$cls = new SomeClassA(); //cause error
@@zitskycom Я вот тоже сижу и гадаю на этот счёт , откуда такая реализация у автора .....
@@theice-r1o я спустя некоторое время вспомнил ещё круче способ. Через кортежи: trait SingletonTrait
{
private static $instance;
public static function getInstance()
{
if (empty(self::$instance)) self::$instance = new static();
return self::$instance;
}
private function __construct()
{
}
private function __clone()
{
}
private function __wakeup()
{
}
}
И можно будет оставить наследование для чего то более полезного ;)
@@zitskycom Вроде раньше в кортежах была какая то проблема с модификаторами доступа если не ошибаюсь?
@@theice-r1o я по крайней мере о таком не слышал, надо будет посмотреть
Хотелось бы видеть эти примеры в фреймах а не просто на голом коде
Юзай автозагрузку, чтоб класс грузить с именем 123 из файла 123.php
Не фига не понятно,но очень интересно)
По мне пример стратегии , неверен , Стратегия это поведенческий паттерн , а значит поле $flyBehavior должно быть или публичным , или к нему надо ставить сеттер дабы была возможность его изменить из вне , интерфейс крайне неудачный , если реализация интерфейса должна подразумевать поведение объекта , почему бы не назвать к примеру IMovable c одним методом move() . Далле уже в стратегии мы просто делаем обкаст к интерфейсу а не к классу реализующим данный интерфейс к примеру
class Animal{
public $movable;
public function __construct(IMovable $movable)
{
$this->movable = $movable
}
public function move()
{
$this->movable->move()
}
}
class Duck extends Animal{}
$animal = new Duck(new Fly());
$animal->move();
$animal->movable = new Run();
$animal->move();
В вашем примере просматривается зависимость в объектах и для создания других типов поведения вы будете вынуждены плодить интерфейсы для каждого отдельного типа поведения, это немного сбивает с толку
слушать нереально. "то,что есть,что именно,например...ээээм...ну когда класс реализует функцию...эээм...это и есть паттерн стратегии" - после этого я дропнул просмотр. если смотреть без звука,то шанс есть,но,как мне кажется,есть неточности в реализации. поэтому дизлайк.
Стратегия это не структурный, а поведенческий паттерн
7:00
7:58
11:55 если есть кто внимательный
14:24
18:30
24:30
1
Автор неправильно реализовал паттерн фабричный метод, получилось простая фабрика без ФАБРЧНОГО МЕТОДА
40 минут убито зря и никакого доверия и уважения к автору нет, он не понимает что такое интерфейс и что такое шаблон и зачем он нужен, какой от него реальный профит
когда учат не ZCE , а мидлы ....
Интерфейсы - это классы без реализации. Интерфейс включать в класс смысла нету и это просто набор лишнего кода, если на выходе не включать контроллеры
А литература?
який жах