๋ฐ์ํ
Flyweight Pattern
ํ๋ผ์ด์จ์ดํธ ํจํด(Flyweight Pattern)์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ด๊ธฐ ์ํด ๋ง์ ์์ ์์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋ ๋์์ธ ํจํด์ ๋๋ค.
- ์ด ํจํด์ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ด์ ์ํ์ ์ธ์ ์ํ๋ก ๋๋์ด, ๋ด์ ์ํ๋ฅผ ๊ณต์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํฉ๋๋ค.
Flyweight Pattern → ๋์ผํ ๊ฒ์ ๊ณต์ ํด์ ๋ญ๋น๋ฅผ ์์ค๋ค๋ ํน์ง์ด ์์ต๋๋ค.
- Flyweight๋ ํ๋ผ์ด๊ธ ์ด๋ผ๋ ์๋ฏธ๋ก, ๊ถํฌ์์ ๊ฐ์ฅ ์ฒด์ค์ด ๊ฐ๋ฒ์ด ์ฒด๊ธ์ ์๋ฏธํฉ๋๋ค.
- Design Pattern์์๋ Object๋ฅผ ๊ฐ๋ณ๊ฒ ํ๊ธฐ ์ํ ๊ฒ์ ์๋ฏธ์์ ์ฌ์ฉ๋ฉ๋๋ค.
- Object๋ ์ปดํจํฐ ๋ด๋ถ์์ ๊ฐ์์ ์ผ๋ก ์กด์ฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฌด๊ฒ๋ค ๋๋ ๊ฐ๋ณ๋ค๊ณ ํํ์ ์ค์ ๋ฌด๊ฒ๊ฐ ์๋, “๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ๋”์ ์๋ฏธํ๋ ๊ฒ์ ๋๋ค.
- ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ๋ณด๋๋๋ฐ, ๊ฐ์ฒด๋ฅผ ๋ง์ด ๋ง๋ ๋ค๊ณ ์๊ฐํด๋ณด๋ฉด ๊ทธ ๊ฐ์ฒด๊ฐ ์ฐจ์งํ๊ณ ์๋ ๋จ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ ์๋ก ๊ฐ๋ฒผ์ ์ง๋๋ค.
“Instance๋ฅผ ๊ฐ๋ฅํ ๋๋ก ๊ณต์ ์์ผ์ ์ธ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง ์๋๋ก ํ๋ค”
- ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋ instance๋ฅผ ์ด์ฉํ ์ ์์ผ๋ฉด ๊ทธ๊ฒ์ ๊ณต์ ํด์ ์ฌ์ฉํฉ๋๋ค.
- Dog๋ name, age, gender, breed, DNA ์์ฑ์ด ์์ต๋๋ค.
- Choco, Baduk ๋ ๋ง๋ฆฌ ๊ฐ์์ง Object๋ฅผ ์์ฑํฉ๋๋ค.
- Dog class์ repr ํจ์๋ฅผ ์ด์ฉํ์ฌ Choco, Baduk ์ ๋ณด๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
๊ฐ์์ง Object๊ฐ ์ด๋์ ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ์ง ๊ณ์ฐํฉ๋๋ค.
- ์ฌ๊ธฐ์ ๊ฐ์์ง๋ค๊ฐ์ ๊ณตํต์ ์์ฑ์ ๊ณต์ ํ๊ฒ ๋๋ฉด memory consumption์ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค.
- Flyweight Pattern์ด๋ ๋ค์์ Object๋ฅผ ์ฌ์ฉํ ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ฐ์์ํต๋๋ค.
๋ชจ๋ ๊ฐ์์ง์ DNA๊ฐ ๊ฐ์ ๊ฒฝ์ฐ
class Dog:
DNAseq = "ATAGGCCTTACCGATGG...."
def __init__(self, name, age, gender, breed):
self.name = name # <20bytes, upto 20 chars
self.age = age # 8 bytes, 64bit integer
self.gender = gender # 1 byte
self.breed = breed # 2 bytes, upto 65k breeds
def __repr__(self):
return f'{self.name},{self.age},{Dog.DNAseq}'
- DNA ์ ๋ณด๋ฅผ ๋ชจ๋ ๊ฐ์์ง๋ค์ด ๊ณต์ ํ๋ค๋ฉด ์ฌ๋ฌ ๊ฐ์์ง๋ฅผ ๋ง๋ค์ด๋ DNA ์ ๋ณด๋ฅผ ๊ณต์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์์ต๋๋ค.
- Dog class attribute๋ก DNA๋ฅผ ๋ฃ์ต๋๋ค.
- ๊ฐ์์ง constructor๋ DNA๋ฅผ ์ ์ธํ ๋ค๋ฅธ property๋ฅผ ์์ฑํฉ๋๋ค.
# Dog ๊ฐ์ฒด ์์ฑ
choco = Dog('choco', 2, 'male', 'shihTzu')
baduk = Dog('baduk', 3, 'female', 'jinDo')
# ์ถ๋ ฅ
print(choco) # ์ถ๋ ฅ: choco,2,ATAGGCCTTACCGATGG....
print(baduk) # ์ถ๋ ฅ: baduk,3,ATAGGCCTTACCGATGG....
- ์ด๋ฒ์๋ choco์ baduk ์ค๋ธ์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ฒฐ๊ณผ๋ ์ด์ ๊ณผ ๋์ผํ์ง๋ง DNA๋ฅผ class attribute๋ก ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๊ฐ์ํฉ๋๋ค.
- ์ฌ๊ธฐ์๋ DNA๋ฅผ flyweight๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
๊ฐ์์ง ์ข ๋ง๋ค DNA ๋ค๋ฅธ ๊ฒฝ์ฐ
์๋ก์ด ๊ฐ์์ง Object๋ฅผ ๋ง๋ค๋๋ผ๋ ์์ธ๋ ์ง๋๊ฐ๋ผ๋ฉด ์ด๋ฏธ ์กด์ฌํ๋ DNA ์ ๋ณด๋ฅผ ๊ฐ๋ฆฌํด์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์์ต๋๋ค.
class DogBreedDNA:
def __init__(self, breed, DNA):
self.breed = breed
self.DNA = DNA
def __repr__(self):
return f'{self.DNA}'
- DogBreedDNA ํด๋์ค๋ ๊ฐ์์ง ์ข ๊ณผ DNA ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ญํ ์ ํฉ๋๋ค.
class Dog:
DNA_Table = {} # {key: DogBreedDNA}
@staticmethod
def addDNA(breed, DNA):
breed_DNA = DogBreedDNA(breed, DNA)
Dog.DNA_Table[breed] = breed_DNA
def __init__(self, name, age, gender, breed):
self.name = name
self.age = age
self.gender = gender
self.breed = breed
if breed not in Dog.DNA_Table:
raise RuntimeError(f"{breed} is not in DNA_Table")
def __repr__(self):
return f'{self.name},{self.age},{Dog.DNA_Table[self.breed]}'
- DNA_Table
- ํด์ฌ๋งต ๊ตฌ์กฐ๋ก key๊ฐ์ ๊ฐ์์ง ์ข (breed), value ๊ฐ์ DogBreedDNA object์ ๋๋ค.
- ํด๋น ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ์ ์๋ static method๋ฅผ ๋ง๋ญ๋๋ค.
- addDNA
- breed์ DNA ์ ๋ณด
- ์ฆ, DogBreedDNA object๋ฅผ DNA_Table์ ๋ฃ์ด์ค๋๋ค.
- init
- Dog object๋ฅผ ์์ฑํ ๋ breed๊ฐ DNA_Table ์์ ์๋ค๋ฉด error๋ฅผ ์์ฑํฉ๋๋ค.
# ์ข
์ ๋ฐ๋ฅธ ์์ธ์ ์ง๋๊ฐ์ DNA ์ ๋ณด๋ฅผ ์ถ๊ฐํจ
Dog.addDNA('shihTzu', 'ATAGGCCTTACCGATGG....')
Dog.addDNA('jinDo', 'ATAGGCCTACCGATGA....')
# Choco์ baduk ๊ฐ์ฒด ์์ฑ
choco = Dog('choco', 2, 'male', 'shihTzu')
baduk = Dog('baduk', 3, 'female', 'jinDo')
# ์ถ๋ ฅ
print(choco) # ์ถ๋ ฅ: choco,2,ATAGGCCTTACCGATGG....
print(baduk) # ์ถ๋ ฅ: baduk,3,ATAGGCCTACCGATGA....
- ์ข ์ ๋ฐ๋ฅธ ์์ธ์ ์ง๋๊ฐ์ DNA ์ ๋ณด๋ฅผ Dog class์ ์ถ๊ฐํฉ๋๋ค.
- Choco, baduk ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ printํฉ๋๋ค.
- choco, baduk์ breed๋ ์ด๋ฏธ DNA_Table์ ์๊ธฐ ๋๋ฌธ์ ์ ๋ณด๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
๊ฐ๋ ํ์ฅ
“์ฌ๋ฌ ์ฅ์์ ์ํฅ์ ๋ฏธ์น๋ค”
- Flyweight Pattern์ Instance๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ด ํ ๋ง์ ๋๋ค.
- ๊ฐ์ฅ ์ฃผ์ํด์ผํ ๊ฒ์ ๊ณต์ ํ๊ณ ์๋ ๊ฒ์ ๋ณ๊ฒฝํ๋ฉด ์ฌ๋ฌ ์ฅ์์ ์ํฅ์ ๋ฏธ์น๋ค๋ ์ ์ ๋๋ค.
- ํ๋์ Instance๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๊ทธ Instance๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ฌ๋ฌ ์ฅ์์ ๋์์ ์ํฅ์ ๋ฏธ์น๊ฒ ๋ฉ๋๋ค.
- ์ฌ๋ฌ ์ฅ์์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ด ํฅ์ ๋์ ๊ฒ์ ์๋๊ณ , ํ๋ก๊ทธ๋จ์ด ์ทจ๊ธํ๋ ๋ฌธ์ ์ ๋ฐ๋ผ์ ์ข์ ์๋, ๋์ ์๋ ์์ต๋๋ค.
- ๋ฐ๋ผ์ Flyweight ์ญํ ์๊ฒ ์ ๊ณตํ๋ ์ ๋ณด๋ ์ ์คํ ์ ํํ ํ์๊ฐ ์์ต๋๋ค.
Intrinsic vs Extrinsic
- Intrinsic: ์๋ ๊ตฌ๋นํ๊ณ ์๋, ๋ณธ์ง์ ์ธ
- Intrinsicํ ์ ๋ณด: ์ธ์คํด์ค๋ฅผ ์ด๋์์ ๊ฐ์ง๊ณ ์๋๋ผ๋ ์ด๋ ํ ์ํฉ์์๋ ๋ณํ์ง ์๋ ์ ๋ณด, ์ํ์ ์์กด๋์ง ์๋ ์ ๋ณด์
๋๋ค.
- "์ฅ์๋ ์ํฉ์ ์์กดํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ณต์ ํ ์ ์๋ค."
- Extrinsic: ์ธ๋ถ์์์จ, ๋น๋ณธ์ง์ ์ธ
- Extrinsicํ ์ ๋ณด: ๊ณต์ ์ํค์ง ์๋ ์ ๋ณด์ด๋ฉฐ, ์ธ์คํด์ค๋ฅผ ๋๋ ์ฅ์์ ๋ฐ๋ผ์ ๋ณํํ๋ ์ ๋ณด, ์ํฉ์ ๋ฐ๋ผ ๋ณํ๋ ์ ๋ณด์
๋๋ค.
- "์ฅ์๋ ์ํฉ์ ์์กดํ๊ธฐ ๋๋ฌธ์ ๊ณต์ ํ ์ ์๋ค."
๋ฐ์ํ
'๐บ๏ธ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] Strategy Pattern - ์ ๋ต ํจํด (0) | 2024.06.08 |
---|---|
[Design Pattern] Composite Pattern - ์ปดํฌ์งํธ ํจํด (0) | 2024.06.08 |
[Design Pattern] Bridge Pattern - ๋ธ๋ฆฟ์ง ํจํด (0) | 2024.06.06 |
[Design Pattern] Facade Pattern - ํ์ฌ๋ ํจํด (0) | 2024.06.06 |
[Design Pattern] Decorator Pattern - ๋ฐ์ฝ๋ ์ดํฐ ํจํด (0) | 2024.06.05 |