파이썬에서 디자인 패턴 'Flyweight' 배우기
■ Flyweight (플라이 웨이트 패턴)
Flyweight 패턴 (플라이 웨이트 패턴)은 GoF에 의해 정의 된 디자인 패턴 중 하나입니다. 동등한 인스턴스를 별도의 위치에서 사용할 때 하나의 인스턴스를 재사용하여 프로그램을 자원 절약하는 것을 목표로합니다.
UML class and sequence diagram
UML 클래스 diagram
(이상 위키피디아(Wikipedia)에서 인용)
□ 비망록
flyweight라고 하는 것은, 「플라이급」으로, 권투에서 가장 체중이 가벼운 계급을 나타내는 것이며, 이 디자인 패턴에서는, 오브젝트를 「가볍게」하기 위한 것이라고 합니다.Flyweight
패턴으로 사용하고 있는 기법은, 「인스턴스를 가능한 한 공유시켜, 쓸데없이 new 하지 않는다」라고 하는 것으로, 인스턴스가 필요할 때, 언제나 new 하는 것이 아니라, 벌써 만들고 있는 인스턴스를 이용할 수 있다 그렇다면 그것을 공유하고 사용하는 것 같습니다.
직관적으로, 디자인 패턴 "Singleton" 의 응용이라고 느끼네요.
■ "Flyweight" 샘플 프로그램
(1) 사전 준비
액키 아트처럼 숫자를 표시하는 텍스트 파일을 준비해 둡니다.
big0.txt....######......
..##......##....
..##......##....
..##......##....
..##......##....
..##......##....
....######......
................
big1.txt......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
big2.txt....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
(이하, 약어)
(2) 동작 확인
실제로 Flyweight 패턴을 활용한 샘플 프로그램을 움직여서 다음과 같은 동작의 모습을 확인하고 싶습니다.
(1) 사전 준비
액키 아트처럼 숫자를 표시하는 텍스트 파일을 준비해 둡니다.
big0.txt
....######......
..##......##....
..##......##....
..##......##....
..##......##....
..##......##....
....######......
................
big1.txt
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
big2.txt
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
(이하, 약어)
(2) 동작 확인
실제로 Flyweight 패턴을 활용한 샘플 프로그램을 움직여서 다음과 같은 동작의 모습을 확인하고 싶습니다.
$ python Main.py 012123
....######......
..##......##....
..##......##....
..##......##....
..##......##....
..##......##....
....######......
................
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
......##........
..######........
......##........
......##........
......##........
......##........
..##########....
................
....######......
..##......##....
..........##....
......####......
....##..........
..##............
..##########....
................
....######......
..##......##....
..........##....
......####......
..........##....
..##......##....
....######......
................
■ 샘플 프로그램에 대해 자세히 알아보기
Git 저장소에도 비슷한 코드가 있습니다.
htps : // 기주 b. 이 m / 싹 보 / s t dy_ 오 f_로 해 응 _ 파테 r
.
├── Main.py
├── big0.txt
├── big1.txt
├── big2.txt
├── big3.txt
├── big4.txt
├── big5.txt
├── big6.txt
├── big7.txt
├── big8.txt
├── big9.txt
└── flyweight
├── __init__.py
└── big_char_factory.py
(1) Flyweight(플라이급)의 역
보통으로 취급하면 프로그램이 무거워지므로 공유하는 것이 좋은 것을 나타내는 역입니다.
샘플 프로그램에서는,
BigChar
클래스가, 이 역할을 노력합니다.flyweight/big_char_factory.py
class BigChar(object):
def __init__(self, charname):
try:
with open("big{0}.txt".format(charname), 'r') as txtfile:
data = txtfile.read()
self.__fontdata = data
except IOError:
self.__fontdata = charname + '?'
def __str__(self):
return self.__fontdata
(2) FlyweightFactory(플라이급의 공장)의 역
Flyweight
를 만드는 공장의 역할입니다. 이 공장을 사용하여 Flyweight
역할을 만들면 인스턴스가 공유됩니다.샘플 프로그램에서는,
BigCharFactory
클래스가, 이 역할을 노력합니다.flyweight/big_char_factory.py
class BigCharFactory(object):
def __init__(self):
self.__pool = {}
@classmethod
def getInstance(cls):
if not hasattr(cls, "_instance"):
cls._instance = cls()
return cls._instance
def getBigChar(self, charname):
bc = self.__pool.get(charname)
if bc is None:
bc = BigChar(charname)
self.__pool[charname] = bc
return bc
(3) Client(의뢰인)의 역할
FlyweightFactory
역을 사용해 Flyweight
를 만들어, 그것을 이용하는 역입니다.샘플 프로그램에서는,
BigString
클래스와 startMain
메소드가, 이 역할을 노력합니다.flyweight/big_char_factory.py
class BigString(object):
def __init__(self, string):
self.bigchars = []
self.factory = BigCharFactory.getInstance()
for s in string:
self.bigchars.append(self.factory.getBigChar(s))
def print(self):
for bc in self.bigchars:
print(bc)
Main.py
import sys
from flyweight.big_char_factory import BigCharFactory, BigString
def startMain(string):
bs = BigString(string)
bs.print()
if __name__ == '__main__':
startMain(sys.argv[1])
■ 참고 URL
Reference
이 문제에 관하여(파이썬에서 디자인 패턴 'Flyweight' 배우기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ttsubo/items/2fecba5f66c7271128ab텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)