Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2016, 00:32   #1
Middle
Новичок
Джуниор
 
Регистрация: 08.04.2016
Сообщений: 4
По умолчанию Вопрос по шаблонам проектирования (PHP)

Вопрос по шаблону проектирования - абстрактная фабрика
Пример взял из вики.

Вопрос в следующем:
Зачем в примере создаются RedSnowman и WhiteSnowman если цвет по идее должен быть свойством объекта и не должен содеражться в имени класса?.....
Если так то у нас тогда получается по одному методу вместо следующих пар : (RedSnowman и WhiteSnowman), (RedHead и WhiteHead),(RedBody и WhiteBody)

т .е зачем вообще нужен шаблон "абстрактна фабрика" если он всегда порождает дубликацию кода в виде идентичных методов в разных классах фабрик?

PHP код:
interface IHead
{
    public function 
drawHead($x$y);
}

class 
RedHead implements IHead
{
    public function 
drawHead($x$y) {
        echo 
'Your red head in axis x = ' $x ' and axis y = ' $y '</ br>' PHP_EOL;
    }
}

class 
WhiteHead implements IHead
{
    public function 
drawHead($x$y) {
        echo 
'Your white head in axis x = ' $x ' and axis y = ' $y '</ br>' PHP_EOL;
    }
}

interface 
IBody
{
    public function 
drawBody($x$y);
}

class 
RedBody implements IBody
{
    public function 
drawBody($x$y) {
        echo 
'Your red body in axis x = ' $x ' and axis y = ' $y '</ br>' PHP_EOL;
    }
}

class 
WhiteBody implements IBody
{
    public function 
drawBody($x$y) {
        echo 
'Your white body in axis x = ' $x ' and axis y = ' $y '</ br>' PHP_EOL;
    }
}

/**
 * Interface ISnowman - this is abstract factory
 */
interface ISnowman
{
    public function 
drawHead($x$y);
    public function 
drawBody($x$y);
}

/**
 * Class WhiteSnowman - concrete factory
 */
class WhiteSnowman implements ISnowman
{
    protected 
$head;
    protected 
$body;

    public function 
__construct() {
        
$this->head = new WhiteHead();
        
$this->body = new WhiteBody();
    }
    public function 
drawHead($x$y) {
        
$this->head->drawHead($x$y);
    }
    public function 
drawBody($x$y) {
        
$this->body->drawBody($x$y);
    }
}
/**
 * Class RedSnowman - concrete factory
 */
class RedSnowman implements ISnowman
{
    protected 
$head;
    protected 
$body;

    public function 
__construct() {
        
$this->head = new RedHead();
        
$this->body = new RedBody();
    }
    public function 
drawHead($x$y) {
        
$this->head->drawHead($x$y);
    }
    public function 
drawBody($x$y) {
        
$this->body->drawBody($x$y);
    }
}

function 
snowman(ISnowman $snowman) {
    
$snowman->drawHead(1,1);
    
$snowman->drawBody(1,2);
}

$typeSnowman 'red';
// мы выбираем тип семейства в начале кода
if($typeSnowman == 'red')
    
$snowman = new RedSnowman();
else
    
$snowman = new WhiteSnowman();

snowman($snowman); 
не лучше ли использовать вместо этого такой код?

PHP код:
<?php

class Snowman
{
    protected 
$head;
    protected 
$body;

    public function 
drawHead($x$y) {
        echo 
'Your ' $this->typeSnowman ' head in axis x = ' $x ' and axis y = ' $y '</ br>' PHP_EOL;
    }

    public function 
drawBody($x$y) {
        echo 
'Your ' $this->typeSnowman ' body in axis x = ' $x ' and axis y = ' $y '</ br>' PHP_EOL;
    }

    public function 
__construct($typeSnowman) {
        
$this->typeSnowman $typeSnowman;
    }
}

function 
snowman($snowman) {
    
$snowman->drawHead(1,1);
    
$snowman->drawBody(1,2);
}

$typeSnowman 'white';
$snowman = new Snowman($typeSnowman);
snowman($snowman);

Последний раз редактировалось Middle; 08.04.2016 в 01:05.
Middle вне форума Ответить с цитированием
Старый 08.04.2016, 01:04   #2
Middle
Новичок
Джуниор
 
Регистрация: 08.04.2016
Сообщений: 4
По умолчанию

Вопрос по шаблону builder

из вики пример:

PHP код:
<?php

/**
 * Паттерн строитель, оперирует известными "рецептами строительства"
 */

/**
 * Pizza - Базовый объект строительства
 */
class Pizza {

    private 
$_pastry "";
    private 
$_sauce "";
    private 
$_garniture "";

    public function 
setPastry($pastry) {
        
$this->_pastry $pastry;
    }
    public function 
setSauce($sauce) {
        
$this->_sauce $sauce;
    }
    public function 
setGarniture($garniture) {
        
$this->_garniture $garniture;
    }

}

/**
 * Builder - Абстрактный строитель
 */
abstract class BuilderPizza {

    protected 
$_pizza;

    public function 
getPizza() {
        return 
$this->_pizza;
    }
    public function 
createNewPizza() {
        
$this->_pizza = new Pizza ();
    }

    abstract public function 
buildPastry();
    abstract public function 
buildSauce();
    abstract public function 
buildGarniture();

}

/**
 * BuilderConcret - Конкретный строитель 1
 */
class BuilderPizzaHawaii extends BuilderPizza {

    public function 
buildPastry() {
        
$this->_pizza->setPastry "normal" );
    }
    public function 
buildSauce() {
        
$this->_pizza->setSauce "soft" );
    }
    public function 
buildGarniture() {
        
$this->_pizza->setGarniture "jambon+ananas" );
    }

}

/**
 * BuilderConcret - Конкретный строитель 2
 */
class BuilderPizzaSpicy extends BuilderPizza {

    public function 
buildPastry() {
        
$this->_pizza->setPastry "puff" );
    }
    public function 
buildSauce() {
        
$this->_pizza->setSauce "hot" );
    }
    public function 
buildGarniture() {
        
$this->_pizza->setGarniture "pepperoni+salami" );
    }

}

/**
 * Director - Управляющий класс, запускающий строительство
 * PizzaBuilder - Реализация патерна Builder, показывающая делегирование процесса создания пиццы методу constructPizza
 */
class PizzaBuilder {
    private 
$_builderPizza;

    public function 
setBuilderPizza(BuilderPizza $mp)
    {
        
$this->_builderPizza $mp;
    }
    public function 
getPizza()
    {
        return 
$this->_builderPizza->getPizza();
    }
    public function 
constructPizza() {
        
$this->_builderPizza->createNewPizza ();
        
$this->_builderPizza->buildPastry ();
        
$this->_builderPizza->buildSauce ();
        
$this->_builderPizza->buildGarniture ();
    }
}

// Инициализация разносчика
$pizzaBuilder = new PizzaBuilder();

// Инициализация доступных продуктов
$builderPizzaHawaii  = new BuilderPizzaHawaii();
$builderPizzaPiquante = new BuilderPizzaSpicy();

// Подготовка и получение продукта
$pizzaBuilder->setBuilderPizza$builderPizzaHawaii );
$pizzaBuilder->constructPizza();
$pizza $pizzaBuilder->getPizza();
зачем этот сыр бор ведь если структуру пиццы мы и так задаем?....просто ее задать в переменную и все?....в чем плюсы шаблона не понимаю?

PHP код:
<?php

// Инициализация доступных продуктов
$PizzaHawaii  = [
    
Pastry => 'normal',
    
Sauce => 'soft',
    
Garniture => 'pepperoni+salami',
];
$PizzaPiquante = [
    
Pastry => 'puff',
    
Sauce => 'hot',
    
Garniture => 'pepperoni+salami',
];
// Подготовка и получение продукта
$pizza $PizzaHawaii;
Middle вне форума Ответить с цитированием
Старый 08.04.2016, 08:12   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
зачем этот сыр бор ведь если структуру пиццы мы и так задаем?....просто ее задать в переменную и все?....в чем плюсы шаблона не понимаю?
Где задаем? Внизу в примере использования билдера не указываются же значения полей, только создается нужный билдер.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.04.2016, 10:37   #4
Middle
Новичок
Джуниор
 
Регистрация: 08.04.2016
Сообщений: 4
По умолчанию

По строителю:

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Где задаем? Внизу в примере использования билдера не указываются же значения полей, только создается нужный билдер.
Да но саму реализацию билдеров мы же тоже пишем? (в ней и задаются значения полей)....- Т.е. эти значения задаются в методах buildPastry(), buildSauce(), buildGarniture()

в чем преимущества шаблона от просто применения кода что ниже?....
Эти два билдера только привносят дубликацию кода
public function buildPastry()
public function buildSauce()
public function buildGarniture()
методы идентичны только задаются разные значения, не лучше ли избегать этой дубликации?...и не передавать то что мы хотим засеттить просто в метод? (хотяв данном примере и этого не нужно просто два массива....и результат тотже)


И вопросы по абстрактной фабрике также актуальны.....

Последний раз редактировалось Middle; 08.04.2016 в 10:44.
Middle вне форума Ответить с цитированием
Старый 08.04.2016, 10:47   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так билдер один раз написали, а свойства основного класса каждый раз задавать надо (+не забыть задать все нужные)
И не всегда только автор кода класса его использует.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 08.04.2016 в 10:49.
Alex11223 вне форума Ответить с цитированием
Старый 08.04.2016, 19:11   #6
Middle
Новичок
Джуниор
 
Регистрация: 08.04.2016
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так билдер один раз написали, а свойства основного класса каждый раз задавать надо (+не забыть задать все нужные)
И не всегда только автор кода класса его использует.
билдер один раз написали??..уверен?...а если кроме Pastry, Sauce, Garniture добавится скажем еще и размер?...будешь дописывать в два билдера метод который сеттит еще и размер к свойствам объекта?...а если билдеров 100 или более?

а так в массив задал новый ключ и все....

PHP код:
$PizzaHawaii  = [
    
Pastry => 'normal',
    
Sauce => 'soft',
    
Garniture => 'pepperoni+salami',
    
RAZMER => '100x100'
];

class 
Pizza {
    function 
__construct($pizzaParams) {
        
//проходимся по массиву и сеттим то что нужно
    
}
}

// Подготовка и получение продукта
$pizza = new PIZZA($PizzaHawaii); 
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
свойства основного класса каждый раз задавать надо (+не забыть задать все нужные)
И не всегда только автор кода класса его использует.
- НЕ понял что каждый раз задавать нада?..и что можно забыть?....И причем тут автор?

Последний раз редактировалось Middle; 08.04.2016 в 19:24.
Middle вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с шаблонам(массив картинок) MariaD PHP 0 25.06.2015 10:50
помогите написать задачу не по шаблонам у меня не получается Djkjlbvbh Общие вопросы C/C++ 2 06.01.2015 12:34
паттерны проектирования prokach Общие вопросы C/C++ 3 18.01.2011 22:23
Сбор данных с множества книг в одну по шаблонам Adeletto Microsoft Office Excel 3 11.06.2010 17:07
Вопрос по шаблонам Ilya_Dem Общие вопросы C/C++ 1 28.05.2010 15:24