Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.08.2013, 01:05
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 1  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
По умолчанию MVC+S + шаблон Фабрика ( Factory )

Начав читать интереснейшие статьи про различные паттерны проектирования, я стал их заложником.
Все они хорошие, все призваны упростить и улучшить код, но хорошее не всегда лучшее и чтобы не отклониться от курса, очень хочется, чтобы опытные, матёрые "кутюрье интернета", поделились секретами о структурировании и создании классов.
И эту тему я создал не из любопытства, а как уже упомянул ранее, из-за неоднозначных слов про то, что "абстрактную фабрику" в проектах не используют. Хоть такой паттерн и есть, но он как я понял не для жизни. И там же говорилось о "обычной фабрике" о которой я не понял не чего..
ГУРУ ?

Добавлено через 13 часов 26 минут
Код AS3:
class Factory {
	private static const ITEMS:Vector.<Class> = Vector.<Class>([Sword, Shield, Boots]);
	public static function createItem(id:uint):IItem { 
		return new ITEMS[id]() as IItem; 
	}
}
// ... somewhere
var item:IItem = Factory.createItem(2); // новый экземпляр класса Boots
Код AS3:
 Вы ожидали код 15-ти классов? Обычная фабрика это не паттерн.
Нет конечно, этого вполне достаточно. Спасибо!. Просто дело вот в чем - "обычная фабрика", это класс, экземпляр которого мы по прежнему не создаём. Мы обращаемся к нему и просим дать нам "что то"(с id 2);
Ну ведь так же и "абстрактная фабрика" устроенна - это тоже класс, экземпляр которого мы не создаем...


Последний раз редактировалось Akopalipsis; 12.08.2013 в 22:15.
Старый 12.08.2013, 14:51
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 2  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Так и есть. Просто в обиходе не заморачиваются и абстрактную фабрику называют фабрикой. Паттерн фабрика впринципе один. Тут путаницы быть не должно.

И там были еще вопросы про фабричный метод.
Фабричный метод это фабричный метод. Фабричный метод может быть одним из вариантов реализации фабрики.
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 12.08.2013, 17:14
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
какой-то ужас написали... ладно, названия классов и методов перепутаны, я еще могу как-то сопоставить. Но оверрайд не может быть с другой сигнатурой
Цитата:
"обычная фабрика", это класс, экземпляр которого мы по прежнему не создаём.
Создавайте, кто ж мешает. Я для простоты привел пример со "статическим" классом, точнее, пример класса фабрики со статическим методом. Но это же абсолютно не принципиально. Для обычной фабрики.
А вот абстрактная тем и отличается, что её экземпляр создать невозможно, потому что он абстрактный. (в моем примере Фабричного метода это был бы интерфейс ЯЗавод. Вы ведь не можете создать экземпляр интерфейса?). Вы создаете экземпляры классов-наследников, и используете их, подставляя нужный. ОК, давайте простой пример. Шахматы. Есть белые и черные фигуры. Есть Абстрактная фабрика с шестью методами, создающими экземпляры фигур — коня, короля, ферзя и т.д. И два класса-наследника, белая фабрика и черная фабрика. Ваше приложение знает ТОЛЬКО абстактную фабрику, у которой можно запросить коня или ладью. Оно не знает, будет конь белым или черным. Или серобуромалиновым в крапинку. Кто-то свыше устанавливает режим "белый", и место абстрактной фабрики занимает конкретная Белая фабрика, которая может отдавать только белых коней и королей. Вот и весь фокус. Это всего-лишь обычный полиморфизм. Клиент не знает, с каким конкретно классом работает, потому что работает с абстрактным суперклассом или интерфейсом. И какой конкретный класс будет производить набор фигур, решается в другом месте. В этом суть паттерна Абстрактная Фабрика. Похоже это хоть чем-то на обычный класс, производящий экземпляры? Смотреть то надо не на результат, а на решаемую задачу. А задачи у них абсолютно разные.
__________________
Reality.getBounds(this);

Старый 12.08.2013, 17:20
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 4  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Холивары про паттерны - это зло.
Надо думать как задачу решить, а не как назвать решение))
__________________
Кто к нам с чем для чего - тот у нас того от того.

Старый 12.08.2013, 22:10
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 5  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Абстрактная фабрика производит конкретные фабрики, которые вы используете для получения конкретного продукта.

Код AS3:
// новый экземпляр фабрики типа IHouseFactory.
const factory:IHouseFactory = AbstractFactory.create("И-522а");
Теперь factory — это фабрика домов типа И-522а
Все фабрики, выпускаемые фабрикой AbstractFactory имеют тип интерфейса IHouseFactory, который умеет производить части дома: фундамент createBasement, окна createWindow, перекрытия, лестничные пролеты и прочая конкретного типа домов (серии).

Код AS3:
const basement:IBasement = factory.createBasement(); // Фундамент серии "И-522а" готов!
const window:IWindow = factory.createWindow(); // Окно серии "И-522а" готово! 
 
basement.addWindow(window); // Собрали дом серии И-522а;
Домашнее задание: построить дом серии И-700а.


ЗЫ. Почитателям друпального агрегатирования привет от инди-разработчика!
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 12.08.2013, 22:12
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 6  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
какой-то ужас написали...
Сорри... даже не буду говорить из-за чего такой код, сами понимаете. Буду исправлять, как раз на шахматах.
Начну с "Абстрактной Фабрики".

Код AS3:
package chess.factory 
{
	import flash.display.Sprite;
 
	internal class Figure extends Sprite
	{
		//метод для переопределения
		internal function drawFigure():void
		{
			//
		}
	}
 
}
Код AS3:
package chess.factory 
{
	internal class BlackHorse extends Figure 
	{
		override internal function drawFigure():void 
		{
			trace('BlackHorse');
		}
	}
 
}
Код AS3:
package chess.factory 
{
	internal class BlackQueen extends Figure 
	{
		override internal function drawFigure():void 
		{
			trace('BlackQueen');
		}
	}
 
}
Код AS3:
package chess.factory 
{
	internal class WhiteHorse extends Figure 
	{
		override internal function drawFigure():void 
		{
			trace('WhiteHorse');
		}
	}
 
}
Код AS3:
package chess.factory 
{
	internal class WhiteQueen extends Figure 
	{
		override internal function drawFigure():void 
		{
			trace('WhiteQueen');
		}
	}
 
}
Код AS3:
package chess.factory 
{
	public class BlackFigure extends FactoryFigure 
	{
		public static const BLACK_HORSE : uint = 0x143423;
		public static const BLACK_QUEEN : uint = 0x331236;
 
		override public function createFigure(id:uint):Figure 
		{
			if (id == BLACK_HORSE)
			{
				trace('BlackFigure create BLACK_HORSE');
				return new BlackHorse();
			}
			else
			if (id == BLACK_QUEEN)
			{
				trace('BlackFigure create BLACK_QUEEN');
				return new BlackQueen();
			}
			else
			{
				trace('ERROR BLACKFIGURE');
				throw new Error('ERROR');
			}
		}
	}
 
}
Код AS3:
package chess.factory 
{
	public class WhiteFigyre extends FactoryFigure 
	{
		public static const WHITE_HORSE : uint = 0xFFFFFF;
		public static const WHITE_QUEEN : uint = 0xE4E7ED;
 
		override public function createFigure(id:uint):Figure 
		{
			if (id == WHITE_HORSE)
			{
				trace('WhiteFigyre create WHITE_HORSE');
				return new WhiteHorse();
			}
			else
			if (id == WHITE_QUEEN)
			{
				trace('WhiteFigyre create WHITE_QUEEN');
				return new WhiteQueen();
			}
			else
			{
				trace('ERROR WHITEFIGYRE');
				throw new Error('ERROR');
			}
		}
	}
 
}
Код AS3:
package chess.factory 
{
	import flash.errors.IllegalOperationError;
 
	public class FactoryFigure 
	{
		public function draw(id:uint):void
		{
			var figure:Figure = createFigure(id);
		}
 
		public function createFigure(id:uint):Figure 
		{
			throw new IllegalOperationError('ERROR');
			return null;
		}
	}
 
}
Код AS3:
package chess 
{
	import chess.factory.BlackFigure;
	import chess.factory.FactoryFigure;
	import chess.factory.WhiteFigyre;
	import flash.display.Sprite;
 
	public class Main extends Sprite 
	{
 
		public function Main() 
		{
			/**
			 * public static const WHITE_HORSE : uint = 0xFFFFFF;
			 * public static const WHITE_QUEEN : uint = 0xE4E7ED;
			 */
			var whiteHorse:FactoryFigure = new WhiteFigyre();
			whiteHorse.draw(0xFFFFFF);
			/**
			 * public static const BLACK_HORSE : uint = 0x143423;
			 * public static const BLACK_QUEEN : uint = 0x331236;
			 */
			var blackHorse:FactoryFigure = new BlackFigure();
			blackHorse.draw(0x143423);
		}
 
	}
 
}
Изображения
 

Старый 12.08.2013, 22:20
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 7  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
и место абстрактной фабрики занимает конкретная Белая фабрика
То есть моё зацикливание на слове "фабрика" имеет более простую основу чем мне казалось.
Если я в классе Main ( как в моём примере ) сразу обращаться к классу Белые фигуры, то это и будет "просто фабрика" ?

Старый 12.08.2013, 22:39
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Нет BlackFigure, WhiteFigyre. Есть конь, ладья, дама, валет и туз. Они производятся на фабриках черных, белых, пика, трефи, бубна и черви. Они (шахматные фигуры или игральные карты) из одной фабрики получаются одного цвета (масти), на которую заточена конкретная фабрика. Прораб утром оглашает план работ: "Каждую четверть дня делать карты следующей масти". Вот, работяги, вам старый знакомый аппарат с набором кнопок, которые выпускают карты по номиналу. Кнопка "валет" выдает номинал... валета, кнопка "2" - простую двоечку. И он подсовывает аппарат, выпускающий все номиналы масти треф. Через четверть рабочего дня меняет на аппарат с такими же кнопками, но выпускающий все номиналы масти бубна. Следующие два аппарата выпускают масти черва и пика. Упаковывающая бригада раскладывает готовую продукцию по колодам и упаковывает их.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 12.08.2013, 23:22
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 9  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Нет BlackFigure, WhiteFigyre.
Вы наверное ошиблись, не должно быть WhiteHorse и BlackHorse, вместо них должно быть Horse и две фабрики - BlackFigure и WhiteFigyre. Да? Или это я ещё раз ошибся?)

Старый 12.08.2013, 23:39
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 10  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
dimarik, хороший пример, спасибо)))

У GoF тоже нормальный пример (мой конечно не очень логичен)) — есть некий интерфейс (GUI) приложения, скажем кнопка, скроллбар, дропменю и чекбокс. И есть два (или больше) стилей для отображения этого интерфейса. Допустим, приложение может выглядеть в стиле Windows, а может в стиле MacOS. Самому приложению совершенно все равно, как выглядят эти кнопки и бары, но они, конечно же, должны соответствовать своим типам, чтобы можно было задавать им значения и запрашивать их.
У приложения есть класс или функция, который должен создать и расставить элементы интерфейса. Он обращается к фабрике, которая представлена Абстрактным Классом или Интерфейсом, и получает от нее экземпляры кнопок и т.п.
Код AS3:
var factory:IGUIFactory;
//... где-то происходит инициализация factory
//... допустим таким образом: factory = AbstractFactory.create("MacOS");
//... затем фабрика создает экземпляры
var scrollbar:IScrollbar = factory.createScrollbar();
var button:IButton = factory.createButton();
var checkbox:ICheckbox = factory.createCheckbox();
var menu:IMenu = factory.createMenu();
Таким образом, заменяя конкретную фабрику, можно получать НАБОР элементов одного стиля (все белые или все черные фигуры, все карты одной масти, все контролы одного стиля). Приложению не нужно знать, какие именно классы будут их производить. Эти классы можно писать отдельно и заменять в любой момент, не трогая остальной код.
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:54.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:54.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.