ООП для чайников. Паттерны проектирования. Приспособленец (flyweight)

Следующий паттерн, — Приспособленец. Приспособленцы моделируют сущности, число которых слишком велико для представления объектами. В моем примере это отрисовка игровой карты (или участка карты). Например ваша карта состоит из плиток пола и стен, но по разному отрисовываются, с учетом света, времени суток, и других факторов. Создавать для каждого сегмента карты отдельный экземпляр, — слишком большая роскошь. Поэтому мы создаем по одному экземпляру каждого типа и с их помощью отрисовываем всю карту.

На диаграмме Приспособленец, выглядит следующим образом:

flyweight

Имеет использовать Приспособленца если одновременно выполняются следующие условия:

  • в приложении используется большое число обьектов, из-за этого высоки расходы на хранение
  • большую часть состояния обьектов можно вынести из объекта Приспособленца

Код примера:

 
class Wall:
 
    def draw(self):
        return "#"
 
class Floor:
 
    def draw(self):
        return "."
 
class MapFactory:
 
    def __init__(self):
        self.classes = (Floor(), Wall())
 
    def getMapClassByNum(self, num):
        return self.classes[num]
 
if __name__ == '__main__':        
    map = """
111101111111
100000000001
100011110011
101000010001
111111111101"""
 
    factory = MapFactory()
    for line in map.split("\n")[1:]:
        for i in line:
            print(factory.getMapClassByNum(int(i)).draw()),
        print("")
 
--------------------------------
 
# # # # . # # # # # # # 
# . . . . . . . . . . # 
# . . . # # # # . . # # 
# . # . . . . # . . . # 
# # # # # # # # # # . # 
 

Comments

comments


Bookmark and Share