Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Factory Pattern 
V
    Опции темы
gta4kv
Дата 8.5.2009, 10:02 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Всем привет smile

Гуглить, честно, поленился. Вопрос, сопсна, в чем смысл паттерна-фабрики? smile (Требую наглядный пример)
И вообще где можно о паттернах нормально почитать? (online)

 smile 
PM MAIL   Вверх
azesmcar
Дата 8.5.2009, 10:04 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 12
Всего: 211



gta4kv

http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%...BD%D0%B8%D1%8F)

Добавлено через 3 минуты и 1 секунду
Цитата(gta4kv @  8.5.2009,  10:02 Найти цитируемый пост)
И вообще где можно о паттернах нормально почитать? (online)

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides - Design Patterns

а вот наглядный пример
http://www.gerd-riesselmann.net/archives/2...-design-pattern
PM   Вверх
gta4kv
Дата 8.5.2009, 10:10 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Сложно как-то написано, и примера PHP нету.
Тогда такой вопрос: в чем его функция в коде? Если с singleton все ясно, то тут, блин, нефига не ясно. \=

Это сообщение отредактировал(а) gta4kv - 8.5.2009, 10:11
PM MAIL   Вверх
azesmcar
Дата 8.5.2009, 10:18 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 12
Всего: 211



Цитата(gta4kv @  8.5.2009,  10:10 Найти цитируемый пост)
Сложно как-то написано, и примера PHP нету.

так я же привел ссылку, там пример на ПХП.

Цитата(gta4kv @  8.5.2009,  10:10 Найти цитируемый пост)
Тогда такой вопрос: в чем его функция в коде? 

его функция - предоставить единый интерфейс для создания группы обьектов.
в коде помогает избавится от множества switch-case ов к примеру.

Допустим мы должны создать картинку, в зависимости от какого-то параметра
Код

$img_type = $_GET["img_type"];
switch ($img_type)
{
   case IMG_GIF: return new GifObject($fres); break;
   case IMG_JPG: return new JpgObject($fres); break;
   case IMG_PNG: return new PngObject($fres); break;
   /*...*/
}

в принципе это уже можно назвать фабрикой, хотя есть и более красивы реализации


Это сообщение отредактировал(а) azesmcar - 8.5.2009, 10:19
PM   Вверх
gta4kv
Дата 8.5.2009, 10:20 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



А как при этом будет фабрика выглядить?

Добавлено через 35 секунд
Цитата

так я же привел ссылку, там пример на ПХП.

Она позже появилась, по-этому не заметил smile
PM MAIL   Вверх
azesmcar
Дата 8.5.2009, 10:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 12
Всего: 211



gta4kv
наверно этот пример будет лучше
Код

class DBfactory
{
    public static $pDB;

    public static function &factory($szType = "")
    {
        if(!is_object(self::$pDB))
        {
            switch($szType)
            {
                case 'mysql':
                    self::$pDB = new DBmysql;
                    break;
                case 'mssql':
                    self::$pDB = new DBmssql;
                    break;
                default:
                    self::$pDB = new DBmysql;
                    break;
            }
        }
        return self::$pDB;
    }
}  

т.е. в зависимости от переданного параметра мы создаем класс для работы с конкретной базой.
далее, читаем из конфига к примеру.
Код

$db = DBfactory::factory($CONFIG["mysql"]);


Добавлено @ 10:29
Цитата(gta4kv @  8.5.2009,  10:20 Найти цитируемый пост)
А как при этом будет фабрика выглядить?

так это и есть фабрика smile
патерн это не какая-то конкретная реализация..это скорее мысль, а как ее реализовать - да как угодно  smile 

Это сообщение отредактировал(а) azesmcar - 8.5.2009, 10:29
PM   Вверх
gta4kv
Дата 8.5.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



тема сисек не раскрыта

в данном примере выходит что от фабрики одно название, остальное просто свитч =)
PM MAIL   Вверх
azesmcar
Дата 8.5.2009, 10:40 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 12
Всего: 211



Цитата(gta4kv @  8.5.2009,  10:29 Найти цитируемый пост)
в данном примере выходит что от фабрики одно название, остальное просто свитч =) 

ну так шаблон проектирования это и есть название с его описанием smile 
фабрика - это предоставление единого интерфейса, для создания множества обьектов.

Добавлено @ 10:44
Например, чтобы было понятнее..еще одна реализация. Правда мне она не очень нравится, просто для примера
Код

<?php
class mysqlClass
{
  function __construct($config = array())
  { 
    echo 'connecting to mysql server ..';
    
  }
}

class mssqlClass
{
  function __construct($config = array())
  { 
    echo 'connecting to mssql server ..';
  }
}


class Database
{
   // This is a factory method because it allows us to instantiate other class
   public static function dbFactory($db,$config = array())
    {
        eval('$obj = new '.$db.'Class();');
        return $obj;
    }
}

$db = Database::dbFactory('mysql',array('host','username','pass','dbname'));

echo "<br/>";

$db = Database::dbFactory('mssql',array('host','username','pass','dbname'));

?>



Это сообщение отредактировал(а) azesmcar - 8.5.2009, 10:45
PM   Вверх
gta4kv
Дата 8.5.2009, 10:53 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Ладно, вроде что-то прояснилось smile

azesmcar, большое спасибо smile


PM MAIL   Вверх
Kirsan
Дата 8.5.2009, 11:03 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.11.2008
Где: г.Волжский, Волго градская обл.

Репутация: 1
Всего: 1



Очень советую почитать книгу, про которую azesmcar говорил (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides - Design Patterns). Довольно доступным языком излагается материал.
В Сети имеется переведённый вариант. 
PM ICQ   Вверх
ksnk
Дата 8.5.2009, 11:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

Итого - возникает понятие красоты объекта, в смысле ООП
-- чем меньше ручек, при условии, что задача решается, тем красивее объект. А красота ящика OOП не интересует, ящик он и у индусов ящик...

Фабрика позволяет сократить количество ручек в определенных условиях у некоторых объектов  smile 

если вернуться к примеру azesmcar, то можно его переписать вот так
Код

class DB #factory
{
    private static $db=array{
        'mysql'=> 'DBmysql',
        'mssql'=> 'DBmssql'
    }
    public static function get($szType = "")
    {
        $class=self::db[$szType];
        return new $class();
    }
}  

...

$fromDb=DB::get('mysql'); # export data from
...
$toDb=DB::get('mssql'); # import data to



понятно, что этому классу не хватает "для полноты" способов динамической регистрации новых типов баз данных и обработки ошибочных ситуаций...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 8.5.2009, 11:56 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



в PHP есть работа с строками, как с лексемами.
например:
Код

$class= "DocumentClass";
$obj = new $class;

там, где это невозможно(например, С++) пришлось бы писать:
Код

flag = 'TClass1';
switch(flag)
{
  case 'TClass1':
     TParentClass obj = new TClass1();
     break;   
  case 'TClass2':
     TParentClass obj = new TClass2();
     break;   
  case 'TClass3':
     TParentClass obj = new TClass3();
     break;   
....
}

код вполне может быть нерабочий(например, объекты могут конструироваться немного не таким кодом), с С/С++ давно дела не имел.
И если бы пришлось добавлять в иерархию новый класс, надо было бы искать в коде все подобные switch'и и редактировать список case'ов.
Для PHP, как мне кажется, это неактуально.
Вообще, паттерны - это не универсальная лопатка. 
К примеру, singleton средствами ООП в классическом Pascal with objects не реализуешь - там нет статических членов класса, только методы. Значит, приходится использовать предопределенную ячейку памяти для хранения или выделять глобальную переменную.(кстати, поправьте, если ошибаюсь).

Добавлено через 5 минут и 49 секунд
Цитата(skyboy @  8.5.2009,  10:56 Найти цитируемый пост)
в PHP есть работа с строками, как с лексемами.

это я так замысловато хотел сказать про переменные переменные и создание объектов по имени класса в строке.
но, кажется, в том виде получилась высокопарная глупость.
PM MAIL   Вверх
azesmcar
Дата 8.5.2009, 12:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 12
Всего: 211



Цитата(skyboy @  8.5.2009,  11:56 Найти цитируемый пост)
там, где это невозможно(например, С++) пришлось бы писать:

В С++ есть шаблоны, шаблонные классы и шаблонные классы унаследованные от нешаблонных классов smile 
Фабрика там очень красиво реализуется. smile 
PM   Вверх
skyboy
Дата 8.5.2009, 12:22 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(azesmcar @  8.5.2009,  11:07 Найти цитируемый пост)
В С++ есть шаблоны

которые появились не внезапно smile
кроме того, есть ещё куча языков. и везде по-разному. в Delphi, например, есть метаклассы(класс классов, переменная такого типа хранит указатель на класс). то есть создание объекта выглядит так:
Код

var 
myClass: TClass;
....
myClass:= TSomeClass;
myClass.Create();
....

и там тоже нет нужды в фабрике. по крайней мере, до тех пор, пока мы можем использовать имя класса(а не некую абстрактную переменную-флаг) для определения класса создаваемого объекта. 
С другой стороны, наверняка есть куча ОО-языков, которые не позволяют вольности, как в PHP, не имеют механизмов метаклассов, как в Delphi и не обзавелись механизмом шаблонов smile
кто ж спорит, что на шаблонах красиво?  smile 
PM MAIL   Вверх
azesmcar
Дата 8.5.2009, 12:25 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 12
Всего: 211



skyboy

ну вы же сами сказали что там пришлось бы писать свитч smile вот я и добавил..
про дельфи знаю только что это что-то связанное с паскалем, который как-то сделали обьекто озабоченным ориентированным smile 
PM   Вверх
gta4kv
Дата 8.5.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



skyboy, спасибо за разъяснения =)
смысл понятен, вроде smile

Это сообщение отредактировал(а) gta4kv - 8.5.2009, 13:14
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1038 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.