Skip to content

Commit f603a27

Browse files
Flyweight Patterns
1 parent c917f1a commit f603a27

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import random
2+
import string
3+
import sys
4+
5+
class User:
6+
def __init__(self, name):
7+
self.name = name
8+
9+
class User2:
10+
strings = []
11+
12+
def __init__(self, full_name):
13+
def get_or_add(s):
14+
if s in self.strings:
15+
return self.strings.index(s)
16+
else:
17+
self.strings.append(s)
18+
return len(self.strings)-1
19+
self.names = [get_or_add(x) for x in full_name.split(' ')]
20+
21+
def __str__(self):
22+
return ' '.join([self.strings[x] for x in self.names])
23+
24+
def random_string():
25+
chars = string.ascii_lowercase
26+
return ''.join([random.choice(chars) for x in range(8)])
27+
28+
29+
if __name__ == '__main__':
30+
users = []
31+
32+
first_names = [random_string() for x in range(100)]
33+
last_names = [random_string() for x in range(100)]
34+
35+
for first in first_names:
36+
for last in last_names:
37+
users.append(User(f'{first} {last}'))
38+
39+
u2 = User2('Jim Jones')
40+
u3 = User2('Frank Jones')
41+
print(u2.names)
42+
print(u3.names)
43+
print(User2.strings)
44+
45+
users2 = []
46+
47+
for first in first_names:
48+
for last in last_names:
49+
users2.append(User2(f'{first} {last}'))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
class FormattedText:
2+
def __init__(self, plain_text):
3+
self.plain_text = plain_text
4+
self.caps = [False] * len(plain_text)
5+
6+
def capitalize(self, start, end):
7+
for i in range(start, end):
8+
self.caps[i] = True
9+
10+
def __str__(self):
11+
result = []
12+
for i in range(len(self.plain_text)):
13+
c = self.plain_text[i]
14+
result.append(c.upper() if self.caps[i] else c)
15+
return ''.join(result)
16+
17+
18+
class BetterFormattedText:
19+
def __init__(self, plain_text):
20+
self.plain_text = plain_text
21+
self.formatting = []
22+
23+
class TextRange:
24+
def __init__(self, start, end, capitalize=False, bold=False, italic=False):
25+
self.end = end
26+
self.bold = bold
27+
self.capitalize = capitalize
28+
self.italic = italic
29+
self.start = start
30+
31+
def covers(self, position):
32+
return self.start <= position <= self.end
33+
34+
def get_range(self, start, end):
35+
range = self.TextRange(start, end)
36+
self.formatting.append(range)
37+
return range
38+
39+
def __str__(self):
40+
result = []
41+
for i in range(len(self.plain_text)):
42+
c = self.plain_text[i]
43+
for r in self.formatting:
44+
if r.covers(i) and r.capitalize:
45+
c = c.upper()
46+
result.append(c)
47+
return ''.join(result)
48+
49+
50+
if __name__ == '__main__':
51+
ft = FormattedText('This is a brave new world')
52+
ft.capitalize(10, 15)
53+
print(ft)
54+
55+
bft = BetterFormattedText('This is a brave new world')
56+
bft.get_range(16, 19).capitalize = True
57+
print(bft)

0 commit comments

Comments
 (0)