Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 5, 2015 12:22:01

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

фабричный метод и абстрактная фабрика

помогите пожалуйста понять в чём разница между шаблонам поектирования “фабричный метод” и “абстрактная фабрика”

вот я написал код, использующий “абстрактную фабрику”:

import random
class Boat(object):
  def __init__(self, name, max_peoples, max_speed, color_num, oars):
    self.max_peoples = max_peoples
    self.max_speed = max_speed
    self.color_num = color_num
    self.oars = oars
    self.name = name
  def __str__(self):
    return str(self.__class__.__name__) + ': ' + str(self.__dict__)
#class RaftFactory(object):
#  pass
#class SubmarineFactory(object):
#  pass
class BoatFactory(object):
  def __new__(self, num):
    return Boat(
      name='beda_'+str(num), 
      max_peoples=random.randint(5, 10), 
      max_speed=(random.randint(5, 10)) * 10, 
      color_num=random.randint(1, 5), 
      oars=random.randint(1, 2)
    )    
class FloatFactory(object):
  def __new__(self, num, factory):
    return factory(num)
if __name__ == '__main__':
  boats = []
  for i in range(4):
    boats.append(FloatFactory(num=i, factory=BoatFactory))
  for boat in boats:
    print(boat)

а вот код, который использует паттерн “фабричный метод”:
import random
class Boat(object):
  def __init__(self, name, max_peoples, max_speed, color_num, oars):
    self.max_peoples = max_peoples
    self.max_speed = max_speed
    self.color_num = color_num
    self.oars = oars
    self.name = name
  def __str__(self):
    return str(self.__class__.__name__) + ': ' + str(self.__dict__)
#class RaftFactory(object):
#  pass
#class SubmarineFactory(object):
#  pass
class BoatFactory(object):
  def __new__(self, num):
    return Boat(
      name='beda_'+str(num), 
      max_peoples=random.randint(5, 10), 
      max_speed=(random.randint(5, 10)) * 10, 
      color_num=random.randint(1, 5), 
      oars=random.randint(1, 2)
    )    
if __name__ == '__main__':
  boats = []
  for i in range(4):
    boats.append(BoatFactory(num=i))
  for boat in boats:
    print(boat)

правильно ли я реализовал примеры для этих двух паттернов?

во втором случае меня смущает то, что фактически класс BoatFactory() там помежуточный и лишний. можно его удалить, а инициализацию перенести в Boat. получается, что я не понимаю как реализовать паттерн “фабричный метод”

Отредактировано zlodiak (Дек. 5, 2015 12:22:31)

Офлайн

#2 Дек. 5, 2015 13:30:55

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

фабричный метод и абстрактная фабрика

Книга М. Самерфилд. Python на практике. Объясняется в чем разница и приводятся примеры.

Офлайн

#3 Дек. 5, 2015 13:31:39

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

фабричный метод и абстрактная фабрика

о, спасибо! целая книга даже

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version