mirror of
https://github.com/tiennm99/java-design-patterns.git
synced 2026-10-15 20:16:00 +00:00
Compare commits
848
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
41625d8d35 | ||
|
|
6055caf34a | ||
|
|
3dad8220bb | ||
|
|
7c0abffe05 | ||
|
|
126ad5fa1f | ||
|
|
c8423198cd | ||
|
|
d7327917cf | ||
|
|
b0c34db084 | ||
|
|
aa11f6b6be | ||
|
|
5698dea49b | ||
|
|
4f28d4eb5b | ||
|
|
22a34127d0 | ||
|
|
8b079dba5c | ||
|
|
a563344a35 | ||
|
|
8c7a3105df | ||
|
|
29442249f8 | ||
|
|
1673930bc0 | ||
|
|
c298e94d96 | ||
|
|
d498332345 | ||
|
|
653bced988 | ||
|
|
5d6ff2f0c4 | ||
|
|
a7000fe61b | ||
|
|
47693507db | ||
|
|
f5bdf688f1 | ||
|
|
401c44b797 | ||
|
|
7e0ddb01cd | ||
|
|
f1dcddfd3a | ||
|
|
688095a4c7 | ||
|
|
b55fc2bcb5 | ||
|
|
74d2dbe0be | ||
|
|
f179974422 | ||
|
|
448c8b5d21 | ||
|
|
fcdf639b15 | ||
|
|
39dce8eedf | ||
|
|
9c5d703dda | ||
|
|
3b9a2df119 | ||
|
|
7b4482f08c | ||
|
|
3b758da41a | ||
|
|
0f67a61be1 | ||
|
|
5a2beb8808 | ||
|
|
4cc30055fc | ||
|
|
2dfb27c859 | ||
|
|
c317ce012a | ||
|
|
177dc52704 | ||
|
|
13cde46f2e | ||
|
|
c70b63d069 | ||
|
|
7473378ca2 | ||
|
|
d4a0ece9e3 | ||
|
|
1288720893 | ||
|
|
8b0cf692cf | ||
|
|
5ff41687df | ||
|
|
51b03f1137 | ||
|
|
4215c86de0 | ||
|
|
f5bd0380d5 | ||
|
|
a0a10b300b | ||
|
|
2c02289711 | ||
|
|
394aff8ac6 | ||
|
|
cd4753a660 | ||
|
|
bdc008fb78 | ||
|
|
93668590e5 | ||
|
|
a9ce57c4d0 | ||
|
|
f8d4dd8506 | ||
|
|
2bfd3e190d | ||
|
|
b0bd9e6593 | ||
|
|
e8595393d6 | ||
|
|
48ba55a8a6 | ||
|
|
b93a202d60 | ||
|
|
9e65023a9f | ||
|
|
9f0b7ae81d | ||
|
|
f93514af39 | ||
|
|
318130c486 | ||
|
|
f7ad42dc05 | ||
|
|
5a0440b696 | ||
|
|
546d9a5bae | ||
|
|
213a4a5ee7 | ||
|
|
83887271ae | ||
|
|
e4384ef7d2 | ||
|
|
d24dd22bb9 | ||
|
|
2d39fe7ed8 | ||
|
|
b8f819988f | ||
|
|
ce5154effc | ||
|
|
265e3d0bda | ||
|
|
a3fcc63167 | ||
|
|
dc3425dd0e | ||
|
|
7c12643b27 | ||
|
|
4caa0bfdbc | ||
|
|
f92e6829c3 | ||
|
|
fecf7e7a82 | ||
|
|
812e4cd6a2 | ||
|
|
3ba2560e09 | ||
|
|
08651d0a00 | ||
|
|
0ab60190ea | ||
|
|
98d3601b1e | ||
|
|
ede37bd055 | ||
|
|
f6bb51581f | ||
|
|
bf164009b4 | ||
|
|
8529017e02 | ||
|
|
3ac1a36b05 | ||
|
|
0da4dcda5b | ||
|
|
a62601a64f | ||
|
|
7d2e6262cc | ||
|
|
8a64f4c574 | ||
|
|
f8f33f586a | ||
|
|
dae93adfee | ||
|
|
ad6bdf802d | ||
|
|
6e20d32213 | ||
|
|
e4681e4a7c | ||
|
|
55bef7ca39 | ||
|
|
e359f1b031 | ||
|
|
fe522fd70d | ||
|
|
1cde704bcb | ||
|
|
d80eca177b | ||
|
|
cb3853a789 | ||
|
|
67bc5e3a62 | ||
|
|
bc42e38938 | ||
|
|
9f7ce4e732 | ||
|
|
1a08b73af8 | ||
|
|
0f37b4ee7f | ||
|
|
2e686b2d73 | ||
|
|
b95bf243e6 | ||
|
|
b8aa775d48 | ||
|
|
d95c6797a4 | ||
|
|
076fc21e40 | ||
|
|
acb40e112b | ||
|
|
9de12ea5f2 | ||
|
|
4afabdb403 | ||
|
|
5241a4ae20 | ||
|
|
4b06dc2a2e | ||
|
|
8ca487e96c | ||
|
|
ce2e5f75d8 | ||
|
|
32c9031fcd | ||
|
|
81ecb5638d | ||
|
|
6195d5e1e8 | ||
|
|
21914f9c88 | ||
|
|
95bfd6cb4d | ||
|
|
ba7be25af3 | ||
|
|
0b83b6dfd1 | ||
|
|
cd224ea5fe | ||
|
|
8e823909da | ||
|
|
e5485dafa9 | ||
|
|
73a582867a | ||
|
|
b8f38691f3 | ||
|
|
30d6875aa1 | ||
|
|
a97bfec0a7 | ||
|
|
54048a1360 | ||
|
|
6cadf253ba | ||
|
|
44f6ab3fd4 | ||
|
|
21fed2172d | ||
|
|
9e5d9e5a2f | ||
|
|
09e531378f | ||
|
|
6d6638ffd8 | ||
|
|
ae737f62ea | ||
|
|
23af67c755 | ||
|
|
3abaa83710 | ||
|
|
261da00a1b | ||
|
|
fdd07c772c | ||
|
|
ecfd944e95 | ||
|
|
32dbc7faa6 | ||
|
|
2aaf712f06 | ||
|
|
6bae409380 | ||
|
|
7ed9e393f0 | ||
|
|
f01235b30a | ||
|
|
15ee32a821 | ||
|
|
8d139234f3 | ||
|
|
48ba1b2053 | ||
|
|
8f263c8cca | ||
|
|
8d5cb59388 | ||
|
|
72eeb167c5 | ||
|
|
d8b07ac484 | ||
|
|
9d23a234bb | ||
|
|
9b64cdee98 | ||
|
|
aef4b37c9a | ||
|
|
30d13083ae | ||
|
|
203548ec03 | ||
|
|
b6c13a2fa0 | ||
|
|
0509fabe8e | ||
|
|
d5a46be3c5 | ||
|
|
25f7bc6fea | ||
|
|
9ca63fce83 | ||
|
|
1b17c400e3 | ||
|
|
35bae7e839 | ||
|
|
bd622823ba | ||
|
|
faea74ae2b | ||
|
|
356db48c8e | ||
|
|
ee699af6ef | ||
|
|
03db45d3ea | ||
|
|
f7e717dcad | ||
|
|
d82328338d | ||
|
|
125b909534 | ||
|
|
b35592ab4a | ||
|
|
914e4f909a | ||
|
|
9073b781b5 | ||
|
|
b1b6e82cb1 | ||
|
|
b7b0a35b5a | ||
|
|
418557129b | ||
|
|
0ca162a55c | ||
|
|
371439aeaa | ||
|
|
afa4518dcf | ||
|
|
ed4a756b62 | ||
|
|
5a371a4e76 | ||
|
|
a6c7d3d41a | ||
|
|
51d5ef1e7c | ||
|
|
3a5553bf21 | ||
|
|
324dad549f | ||
|
|
3dc27b25bb | ||
|
|
0f19b475b2 | ||
|
|
7effd99f0d | ||
|
|
770a85e56f | ||
|
|
02ae009c32 | ||
|
|
adf5b62753 | ||
|
|
abfb137040 | ||
|
|
baf2efa23c | ||
|
|
894ae8f10c | ||
|
|
dd8b9b377a | ||
|
|
0b1933ece3 | ||
|
|
a89cf9866b | ||
|
|
8164b97ad5 | ||
|
|
66768fcc48 | ||
|
|
845a42834d | ||
|
|
29d1e304ff | ||
|
|
19d9d31bb7 | ||
|
|
e403df81fc | ||
|
|
457858cc13 | ||
|
|
17267493c6 | ||
|
|
fbde0090a0 | ||
|
|
8a2c779809 | ||
|
|
74f5fdfea9 | ||
|
|
0904e2da3b | ||
|
|
511f0084fa | ||
|
|
4a96f2d227 | ||
|
|
d36eeec52c | ||
|
|
b9938055bc | ||
|
|
30347328d6 | ||
|
|
e24739c541 | ||
|
|
d78337e4b6 | ||
|
|
d0701d6471 | ||
|
|
eee75757fb | ||
|
|
546c7ecf53 | ||
|
|
a10c392425 | ||
|
|
609bf8e4d1 | ||
|
|
f3c4a83a0a | ||
|
|
2e40cc02d3 | ||
|
|
4e16d4b1e7 | ||
|
|
1f44a8c84c | ||
|
|
851ebba4d7 | ||
|
|
6785b53b02 | ||
|
|
e17f138223 | ||
|
|
fb92682cd5 | ||
|
|
2e7eef136a | ||
|
|
be0815680b | ||
|
|
39e4d6ab8a | ||
|
|
a25b6a003d | ||
|
|
9ad38a4f3c | ||
|
|
21115f4568 | ||
|
|
3a1a71405b | ||
|
|
2a261cd734 | ||
|
|
07c82e460a | ||
|
|
49172dd5be | ||
|
|
f0f4c7d4c0 | ||
|
|
03f0bee103 | ||
|
|
fee3c43f20 | ||
|
|
1bfdf21469 | ||
|
|
b419f849d9 | ||
|
|
aedbe161f3 | ||
|
|
8cb7c9ada6 | ||
|
|
bcad5b1aa3 | ||
|
|
caa51bdb22 | ||
|
|
ab59dfe770 | ||
|
|
c06bd2c5a1 | ||
|
|
afcd964e7b | ||
|
|
60e21294d3 | ||
|
|
5ba45701bf | ||
|
|
ebcc070e11 | ||
|
|
cdb78d7fb6 | ||
|
|
ac539606b1 | ||
|
|
84a18185f7 | ||
|
|
c5a6862887 | ||
|
|
eb7a0dff55 | ||
|
|
8938054691 | ||
|
|
b9ff511c7a | ||
|
|
f1a0ad8cc0 | ||
|
|
eead12d308 | ||
|
|
adbddcb518 | ||
|
|
fc07a38ed6 | ||
|
|
297e429e5a | ||
|
|
b375919db5 | ||
|
|
0f27139fda | ||
|
|
b383d2ec1a | ||
|
|
f9945c9ce7 | ||
|
|
8a0f433e4a | ||
|
|
391aec449b | ||
|
|
0d63c95ad3 | ||
|
|
97de002348 | ||
|
|
82e30ab717 | ||
|
|
2a2c5605bc | ||
|
|
25bb77eee7 | ||
|
|
e761d78651 | ||
|
|
094027e0f7 | ||
|
|
a50a45ae0d | ||
|
|
f48c686f2b | ||
|
|
1575b56b98 | ||
|
|
af0b901706 | ||
|
|
6e0df3facd | ||
|
|
cb1b0b291a | ||
|
|
337f0451e1 | ||
|
|
076863b937 | ||
|
|
7c8802ef6f | ||
|
|
ede0fc16ae | ||
|
|
b00b8aa365 | ||
|
|
0da86434ee | ||
|
|
083a46ffcd | ||
|
|
f1a73e33f0 | ||
|
|
b82cdf7ed9 | ||
|
|
69eace4a49 | ||
|
|
4c043e58d9 | ||
|
|
7472d2f99e | ||
|
|
084817f307 | ||
|
|
53b973e83f | ||
|
|
fcb0698b00 | ||
|
|
ace3c4d015 | ||
|
|
57baf1334e | ||
|
|
539fda29ac | ||
|
|
24b4586944 | ||
|
|
8bd31758b9 | ||
|
|
007dcb15bf | ||
|
|
4cb8eed9b7 | ||
|
|
186b28f262 | ||
|
|
836542e5d6 | ||
|
|
6ab6c3c3df | ||
|
|
61e767dbe5 | ||
|
|
572011665a | ||
|
|
7812bf62bb | ||
|
|
9c43d85f36 | ||
|
|
1d454f7721 | ||
|
|
f22eda8d44 | ||
|
|
8e51bd49f5 | ||
|
|
990cfbf812 | ||
|
|
d1c58cd86e | ||
|
|
d6f2cf2973 | ||
|
|
823d0572dc | ||
|
|
fab64a2622 | ||
|
|
e65f4d6038 | ||
|
|
5dce3d8231 | ||
|
|
c9e29aceec | ||
|
|
1990dbec05 | ||
|
|
589c6d7688 | ||
|
|
3ce7c33df6 | ||
|
|
87348908e3 | ||
|
|
a27e0923b0 | ||
|
|
aa2b190a8c | ||
|
|
f9946debca | ||
|
|
6cd2d0353a | ||
|
|
cb946c0cdc | ||
|
|
f8c7c040a6 | ||
|
|
f42e60ce47 | ||
|
|
f0611bcb10 | ||
|
|
205dc1f99f | ||
|
|
f25bd1137a | ||
|
|
ed90c41083 | ||
|
|
d872bf97c9 | ||
|
|
c5de9f637e | ||
|
|
1c478a52a9 | ||
|
|
dd38bd3ffb | ||
|
|
d4b0f3db8d | ||
|
|
acb2eae078 | ||
|
|
ec5d08e982 | ||
|
|
bf8388837a | ||
|
|
684b2e219e | ||
|
|
68ef414e19 | ||
|
|
584e949714 | ||
|
|
4652842c94 | ||
|
|
26579fea49 | ||
|
|
2bbf893133 | ||
|
|
cca57bfa5e | ||
|
|
3eb5813133 | ||
|
|
5d44152bbc | ||
|
|
723b1bf311 | ||
|
|
790d2d6916 | ||
|
|
0abb75a20d | ||
|
|
d26454af88 | ||
|
|
4b5f34ebea | ||
|
|
2d1b75644f | ||
|
|
f4e2c7f3e2 | ||
|
|
a6458c469d | ||
|
|
8372d925f5 | ||
|
|
13d35ec474 | ||
|
|
d4f80630aa | ||
|
|
201675d7fc | ||
|
|
aed840d72c | ||
|
|
10f37987d2 | ||
|
|
f7f318ad37 | ||
|
|
07d56c77cf | ||
|
|
42ea1462b7 | ||
|
|
822bcd0d16 | ||
|
|
4efd714aa5 | ||
|
|
e8f36363e9 | ||
|
|
26d7d55eb6 | ||
|
|
1e93895ec6 | ||
|
|
b4c3ddfec1 | ||
|
|
0918074667 | ||
|
|
13dcb949b7 | ||
|
|
216428eb5c | ||
|
|
6bf960a636 | ||
|
|
1af54aba49 | ||
|
|
a4cf4cdfc6 | ||
|
|
37f4758033 | ||
|
|
6f52cc1d00 | ||
|
|
2411c9caac | ||
|
|
42a73e5a22 | ||
|
|
7d69275db8 | ||
|
|
90bc1cf32c | ||
|
|
3824effab2 | ||
|
|
0d35b4a1a9 | ||
|
|
f71aa867ac | ||
|
|
94b90229b4 | ||
|
|
839beb29da | ||
|
|
8e881551cf | ||
|
|
188fff282b | ||
|
|
562e4cd9ec | ||
|
|
bfff01d556 | ||
|
|
f8fef0288d | ||
|
|
78ce689a30 | ||
|
|
3cd86ab135 | ||
|
|
3a569a691d | ||
|
|
15b916a838 | ||
|
|
eb6da7397d | ||
|
|
e1e5a15720 | ||
|
|
f655cee274 | ||
|
|
5e133822ad | ||
|
|
6f46fbb208 | ||
|
|
42db186033 | ||
|
|
1e2dbf2b9b | ||
|
|
27ef340e68 | ||
|
|
cc232ee446 | ||
|
|
533ca0df6a | ||
|
|
a0f90fa75e | ||
|
|
6ff2009f61 | ||
|
|
fe49ea8dfa | ||
|
|
1786a78d83 | ||
|
|
cee255e63d | ||
|
|
d03b2362db | ||
|
|
6d961b54d7 | ||
|
|
093781b312 | ||
|
|
630b054554 | ||
|
|
64443afcb9 | ||
|
|
a868f4d80e | ||
|
|
79fc4f2c0d | ||
|
|
275dad5572 | ||
|
|
fa76981011 | ||
|
|
f91d35299f | ||
|
|
4d8b4c4873 | ||
|
|
b5d280e4f5 | ||
|
|
d991970439 | ||
|
|
a3080c00f9 | ||
|
|
e12085f158 | ||
|
|
88101fc4eb | ||
|
|
fe9e7f9d7d | ||
|
|
5a86b75ffc | ||
|
|
9c796135b5 | ||
|
|
fe779cc93b | ||
|
|
b5391c9b2d | ||
|
|
9e25711bad | ||
|
|
774d6820a2 | ||
|
|
248f955f16 | ||
|
|
bd5ff136c2 | ||
|
|
506d64cf40 | ||
|
|
8985c33df2 | ||
|
|
3035f40334 | ||
|
|
cbf1c77008 | ||
|
|
9857897eda | ||
|
|
a4ded4b57a | ||
|
|
926e0b31b0 | ||
|
|
325b580ccc | ||
|
|
d6bb988e42 | ||
|
|
b901e51c50 | ||
|
|
74f039f1cd | ||
|
|
865d98cbec | ||
|
|
9c30eaa5ed | ||
|
|
ff7594465c | ||
|
|
784554e302 | ||
|
|
8eb00a45d1 | ||
|
|
52eb5c7d69 | ||
|
|
e3c3b055f5 | ||
|
|
30cb525c04 | ||
|
|
4e0382ca9f | ||
|
|
bf06bfc22a | ||
|
|
6620e15075 | ||
|
|
fbaed48f06 | ||
|
|
00c303e259 | ||
|
|
f9cb2b6ebe | ||
|
|
410c0c69a3 | ||
|
|
b855476315 | ||
|
|
08aafce66d | ||
|
|
c369b35f43 | ||
|
|
92190a740c | ||
|
|
4f6e14767d | ||
|
|
6cbcf0fe4a | ||
|
|
0c31312510 | ||
|
|
9890579de4 | ||
|
|
a4f3f8ace9 | ||
|
|
f6e1518d20 | ||
|
|
8189457187 | ||
|
|
3812d22392 | ||
|
|
3a38e2be6b | ||
|
|
518ffa4d4d | ||
|
|
1029c02993 | ||
|
|
19c6548a20 | ||
|
|
a0d4729a85 | ||
|
|
d58eeab8cb | ||
|
|
47ee0b3a70 | ||
|
|
98268a11d0 | ||
|
|
b483bd8e63 | ||
|
|
80ae1a9bca | ||
|
|
a33b324f18 | ||
|
|
f2753b9460 | ||
|
|
ccad122750 | ||
|
|
8162dc19fb | ||
|
|
c506d5d8c3 | ||
|
|
4082742ae2 | ||
|
|
d224b8dfa0 | ||
|
|
c20ee75910 | ||
|
|
4839e09034 | ||
|
|
29ab8eb4d7 | ||
|
|
8ed3cc99f7 | ||
|
|
cad9374077 | ||
|
|
8f79088989 | ||
|
|
374cb4c0df | ||
|
|
386c67941d | ||
|
|
04a572f7c1 | ||
|
|
f0ae9f545a | ||
|
|
296a0cd7e9 | ||
|
|
1baf6dd722 | ||
|
|
6ccf6104ac | ||
|
|
31f0f5a904 | ||
|
|
3b90a051e6 | ||
|
|
6e123be3bd | ||
|
|
8389456532 | ||
|
|
7273c242b6 | ||
|
|
962e8898e0 | ||
|
|
399970f8d1 | ||
|
|
33df05a516 | ||
|
|
c9c73490c8 | ||
|
|
d6d2a76c1f | ||
|
|
8dd3e3ed89 | ||
|
|
e5e406a71f | ||
|
|
84df9ad48a | ||
|
|
e87b18edf3 | ||
|
|
8ed580018c | ||
|
|
b3abdb3341 | ||
|
|
6ed6b1c0f0 | ||
|
|
628ec1548c | ||
|
|
16fbd26a42 | ||
|
|
49dab27c85 | ||
|
|
45052c65f5 | ||
|
|
3b70f7168c | ||
|
|
16d8395c81 | ||
|
|
7ca0445110 | ||
|
|
f3bde28d01 | ||
|
|
7bf1e36e5d | ||
|
|
0b79e5a9b9 | ||
|
|
9f61b7858c | ||
|
|
74f53eddd4 | ||
|
|
3703aa6e64 | ||
|
|
dde2a78a46 | ||
|
|
e9ce201b6f | ||
|
|
3ee5ed8716 | ||
|
|
593957094f | ||
|
|
3b2098b80d | ||
|
|
547cf20140 | ||
|
|
e76bdffab4 | ||
|
|
882bcbf385 | ||
|
|
cd6c72548c | ||
|
|
1c421b27ad | ||
|
|
d656295d3c | ||
|
|
2a789cf65a | ||
|
|
292554e76e | ||
|
|
cfb09c1358 | ||
|
|
378c814bb7 | ||
|
|
d798a53b03 | ||
|
|
ddf20b8262 | ||
|
|
25d12fdc06 | ||
|
|
3297eb42a0 | ||
|
|
f7c00f2b16 | ||
|
|
a8433cc634 | ||
|
|
f6d77a684e | ||
|
|
e731bdb998 | ||
|
|
cfbb5af821 | ||
|
|
a766f188a8 | ||
|
|
1da0f41381 | ||
|
|
551e3548d0 | ||
|
|
57f7c392e8 | ||
|
|
a0abbf09d9 | ||
|
|
6e22be370f | ||
|
|
279d227fd4 | ||
|
|
ed7d912cc2 | ||
|
|
0dd466cb38 | ||
|
|
9665381a85 | ||
|
|
5e8e566a34 | ||
|
|
f485c3d603 | ||
|
|
51716824ee | ||
|
|
1d2b61e6ed | ||
|
|
bb8ca34115 | ||
|
|
ffd3440d1f | ||
|
|
e51522ed73 | ||
|
|
a878938544 | ||
|
|
876dce43f8 | ||
|
|
74316d302c | ||
|
|
abbc33295d | ||
|
|
1f7aaef392 | ||
|
|
86b0520f9d | ||
|
|
cf3282149b | ||
|
|
a26f4aa209 | ||
|
|
164feff49e | ||
|
|
30437d324b | ||
|
|
ecd77ac108 | ||
|
|
3eef30b115 | ||
|
|
d27466a542 | ||
|
|
e75fd3743e | ||
|
|
6cbb8aca02 | ||
|
|
a1c4447615 | ||
|
|
fd7677931c | ||
|
|
10cb8c0c09 | ||
|
|
6cc4525bc1 | ||
|
|
de1dd7f82a | ||
|
|
36a9eea769 | ||
|
|
bf6456ba69 | ||
|
|
0810b5531c | ||
|
|
b6a1f18acf | ||
|
|
2ad022053d | ||
|
|
66c01d3431 | ||
|
|
ff8ad83ef6 | ||
|
|
2faa45aa80 | ||
|
|
1b04adadb8 | ||
|
|
df578ce58d | ||
|
|
9dbffa269a | ||
|
|
a3b582f993 | ||
|
|
3c7b3d99cc | ||
|
|
fa557ae52e | ||
|
|
24d5961a20 | ||
|
|
176a8db87f | ||
|
|
92ae818fe2 | ||
|
|
30cb9af12b | ||
|
|
c93f894814 | ||
|
|
cb1872a7a4 | ||
|
|
7460e46f9c | ||
|
|
ef42e169b9 | ||
|
|
5e12bc588a | ||
|
|
58ec27de87 | ||
|
|
943f3fbb26 | ||
|
|
1430735db5 | ||
|
|
167aa5afdb | ||
|
|
4451ffbe64 | ||
|
|
8d1f81b38f | ||
|
|
3f697fe4c7 | ||
|
|
a2e4307044 | ||
|
|
63a2740210 | ||
|
|
ec88a8a0ea | ||
|
|
ad3aef7b71 | ||
|
|
c0e20ec570 | ||
|
|
3d48f06980 | ||
|
|
78e57a5490 | ||
|
|
b00d79a79e | ||
|
|
b55e85f8de | ||
|
|
d6133e3bb0 | ||
|
|
596f429aa0 | ||
|
|
dabf40e1bb | ||
|
|
ab1a30ba69 | ||
|
|
6d385349cb | ||
|
|
6a97047aaa | ||
|
|
2b58233080 | ||
|
|
a251032768 | ||
|
|
4a558bb956 | ||
|
|
11289b8cfc | ||
|
|
19f99a7a07 | ||
|
|
b35494af9a | ||
|
|
59d3e52434 | ||
|
|
9615fd9e72 | ||
|
|
fe6841e8c6 | ||
|
|
bcf88a61fa | ||
|
|
2395ac2a8d | ||
|
|
a6c2e4ad91 | ||
|
|
43db34a394 | ||
|
|
7cebde007b | ||
|
|
1c801da4a7 | ||
|
|
f52f71cba2 | ||
|
|
730907d0d3 | ||
|
|
8a3bed0e95 | ||
|
|
4f69dea978 | ||
|
|
75409a9d0d | ||
|
|
ffffab40ec | ||
|
|
825d45b086 | ||
|
|
9240d80ef2 | ||
|
|
2807f1f976 | ||
|
|
56dfd8c2d7 | ||
|
|
44071ab497 | ||
|
|
943d233120 | ||
|
|
70fc5736f6 | ||
|
|
14dc7af72c | ||
|
|
f945ba50c2 | ||
|
|
6401b0fd11 | ||
|
|
66538ddcda | ||
|
|
317f9c3920 | ||
|
|
1e4edc80d0 | ||
|
|
63dd063372 | ||
|
|
d45dcb1a63 | ||
|
|
1a50353b49 | ||
|
|
fc5b8c3d56 | ||
|
|
0b850aa764 | ||
|
|
c1466eb66e | ||
|
|
e09cada960 | ||
|
|
99f77f8119 | ||
|
|
b8f5d46ba7 | ||
|
|
39acd1d0fb | ||
|
|
ea55eb4e58 | ||
|
|
356ba27272 | ||
|
|
b376f1de9a | ||
|
|
b1f8a16b9c | ||
|
|
85823b4732 | ||
|
|
faac96b21b | ||
|
|
8f777cdc98 | ||
|
|
20e804ba95 | ||
|
|
982526f286 | ||
|
|
423efcf84e | ||
|
|
9f8829c8c4 | ||
|
|
ead6373765 | ||
|
|
dd9beebd75 | ||
|
|
74be3a537c | ||
|
|
3ac7cc3268 | ||
|
|
e0b1250019 | ||
|
|
9f97c1505d | ||
|
|
74cce87c70 | ||
|
|
9258cc854b | ||
|
|
a155ee2433 | ||
|
|
de5a93c499 | ||
|
|
dfd34d890b | ||
|
|
44a9766656 | ||
|
|
d3e7401f70 | ||
|
|
fd109955dc | ||
|
|
e00e67c9a6 | ||
|
|
48a5edef0e | ||
|
|
81ebcf0a79 | ||
|
|
2228212c23 | ||
|
|
30ac97fe59 | ||
|
|
8471c93035 | ||
|
|
9538c7820c | ||
|
|
7c1889b8e5 | ||
|
|
6322d538cd | ||
|
|
f80cc468b2 | ||
|
|
ea7bc2a4eb | ||
|
|
254504e52e | ||
|
|
5bba35aad2 | ||
|
|
baa7793f3c | ||
|
|
910d6a7579 | ||
|
|
2b934dfaef | ||
|
|
6e806c238e | ||
|
|
7d0874d88a | ||
|
|
2061fe8c59 | ||
|
|
55f43fd514 | ||
|
|
7c516064c6 | ||
|
|
9f53811116 | ||
|
|
46fe841296 | ||
|
|
be914e0bc3 | ||
|
|
a8ee68d4d8 | ||
|
|
b5ddd62145 | ||
|
|
be3a184445 | ||
|
|
6816c34218 | ||
|
|
ca92c79c15 | ||
|
|
cc1854f0a0 | ||
|
|
965af11cb0 | ||
|
|
2667840060 | ||
|
|
bffcbbf1fd | ||
|
|
d51627d39a | ||
|
|
82c2bf25e2 | ||
|
|
b8fd6dd2a4 | ||
|
|
01e3d9dc4b | ||
|
|
4d30e99e31 | ||
|
|
8d2b101e03 | ||
|
|
f65bb820d8 | ||
|
|
4b704c807f | ||
|
|
8223d842fa | ||
|
|
79dd5a7abc | ||
|
|
846dea2dca | ||
|
|
dc7495e8bd | ||
|
|
5c1ad5c006 | ||
|
|
c7c0828a07 | ||
|
|
dc9ee19445 | ||
|
|
35d817e05e | ||
|
|
5c47447d9b | ||
|
|
7034ca5e95 | ||
|
|
e30e359c95 | ||
|
|
59cd01897a | ||
|
|
dcdb0aff3e | ||
|
|
db6ad08daa | ||
|
|
0e13ebec98 | ||
|
|
3c4cbd564b | ||
|
|
2aadb3d60f | ||
|
|
8a91cbba89 | ||
|
|
a4a4edf990 | ||
|
|
02f1fdc261 | ||
|
|
e56a8e15b0 | ||
|
|
d33f839c0f | ||
|
|
cc9a6c05ef | ||
|
|
eacfb13ebf | ||
|
|
4dd758b1be | ||
|
|
e377047a69 | ||
|
|
90f5b38a45 | ||
|
|
aaa44fd606 | ||
|
|
5a633acac7 | ||
|
|
c702df04ae | ||
|
|
98505c61dd | ||
|
|
961121c9b1 | ||
|
|
e340f4f3f8 | ||
|
|
2d54709d1a | ||
|
|
ec80239e5e | ||
|
|
fa75ed02a8 | ||
|
|
249efd1e71 | ||
|
|
b2ca49a4e5 | ||
|
|
09b9ee2f5f | ||
|
|
54d6280322 | ||
|
|
f42f547133 | ||
|
|
f8aeaa19bd | ||
|
|
1d40a1b114 | ||
|
|
25a58e0c09 | ||
|
|
b005b1a69a | ||
|
|
fb80886685 | ||
|
|
b2c7410c03 | ||
|
|
79d41d9336 | ||
|
|
1ab8ca76fb | ||
|
|
89d9558b00 | ||
|
|
a258bcc1eb | ||
|
|
4277a54835 | ||
|
|
a1f527eb28 | ||
|
|
6f8a95debd | ||
|
|
8d74b3eb40 | ||
|
|
b994d9a70d | ||
|
|
93112da51c | ||
|
|
4575879264 | ||
|
|
f5747d85f1 | ||
|
|
8c316e75fe | ||
|
|
803a2624f6 | ||
|
|
c2709c445b | ||
|
|
88b4cbc008 | ||
|
|
d4d428f98a | ||
|
|
87a774c9d6 | ||
|
|
4a315e7f4b | ||
|
|
45f63a70f1 | ||
|
|
719c46d10d | ||
|
|
0f39267a19 |
No files matched your search
+953
-6
@@ -1548,7 +1548,8 @@
|
|||||||
"avatar_url": "https://avatars.githubusercontent.com/u/17254162?v=4",
|
"avatar_url": "https://avatars.githubusercontent.com/u/17254162?v=4",
|
||||||
"profile": "https://www.linkedin.com/in/souzasamuel/",
|
"profile": "https://www.linkedin.com/in/souzasamuel/",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code",
|
||||||
|
"doc"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -2546,7 +2547,7 @@
|
|||||||
"login": "tiennm99",
|
"login": "tiennm99",
|
||||||
"name": "Tien Nguyen Minh",
|
"name": "Tien Nguyen Minh",
|
||||||
"avatar_url": "https://avatars.githubusercontent.com/u/39063457?v=4",
|
"avatar_url": "https://avatars.githubusercontent.com/u/39063457?v=4",
|
||||||
"profile": "http://miti99.dev",
|
"profile": "https://github.com/tiennm99",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"code",
|
"code",
|
||||||
"translation"
|
"translation"
|
||||||
@@ -2567,7 +2568,8 @@
|
|||||||
"avatar_url": "https://avatars.githubusercontent.com/u/101238933?v=4",
|
"avatar_url": "https://avatars.githubusercontent.com/u/101238933?v=4",
|
||||||
"profile": "https://surjendu-pal.netlify.app/",
|
"profile": "https://surjendu-pal.netlify.app/",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"translation"
|
"translation",
|
||||||
|
"code"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -2759,7 +2761,8 @@
|
|||||||
"avatar_url": "https://avatars.githubusercontent.com/u/141746282?v=4",
|
"avatar_url": "https://avatars.githubusercontent.com/u/141746282?v=4",
|
||||||
"profile": "https://github.com/jnniu-n",
|
"profile": "https://github.com/jnniu-n",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"translation"
|
"translation",
|
||||||
|
"doc"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -2832,7 +2835,9 @@
|
|||||||
"avatar_url": "https://avatars.githubusercontent.com/u/7249450?v=4",
|
"avatar_url": "https://avatars.githubusercontent.com/u/7249450?v=4",
|
||||||
"profile": "https://github.com/ylcn91",
|
"profile": "https://github.com/ylcn91",
|
||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code",
|
||||||
|
"doc",
|
||||||
|
"review"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -2853,9 +2858,951 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "takikuba",
|
||||||
|
"name": "Jakub Klimek",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/58841343?v=4",
|
||||||
|
"profile": "https://github.com/takikuba",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "bachbil",
|
||||||
|
"name": "believe",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/28935461?v=4",
|
||||||
|
"profile": "https://github.com/bachbil",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "egg0102030405",
|
||||||
|
"name": "egg0102030405",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/59650695?v=4",
|
||||||
|
"profile": "https://github.com/egg0102030405",
|
||||||
|
"contributions": [
|
||||||
|
"translation",
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "ved-asole",
|
||||||
|
"name": "Ved Asole",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/77259804?v=4",
|
||||||
|
"profile": "https://github.com/ved-asole",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Holiday-C",
|
||||||
|
"name": "NewMorning",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/95869761?v=4",
|
||||||
|
"profile": "https://github.com/Holiday-C",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Kiro-Young",
|
||||||
|
"name": "资深老萌新",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/98251397?v=4",
|
||||||
|
"profile": "https://github.com/Kiro-Young",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Nickolodeon98",
|
||||||
|
"name": "Seunghwan Jeon",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/113348293?v=4",
|
||||||
|
"profile": "https://itistori.tistory.com/",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "sugan0tech",
|
||||||
|
"name": "sugavanesh",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/71312159?v=4",
|
||||||
|
"profile": "https://github.com/sugan0tech",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "FinnS-F",
|
||||||
|
"name": "FinnS-F",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/126026830?v=4",
|
||||||
|
"profile": "https://github.com/FinnS-F",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "jerryyummy",
|
||||||
|
"name": "jerryyummy",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/62087610?v=4",
|
||||||
|
"profile": "https://github.com/jerryyummy",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Manojkumarchow",
|
||||||
|
"name": "Manoj Chowdary",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/28005510?v=4",
|
||||||
|
"profile": "https://manojkumarchow.github.io/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "MaverickWingman",
|
||||||
|
"name": "Aditya",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/76624290?v=4",
|
||||||
|
"profile": "https://github.com/MaverickWingman",
|
||||||
|
"contributions": [
|
||||||
|
"doc",
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "nooynayr",
|
||||||
|
"name": "nooynayr",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/141696269?v=4",
|
||||||
|
"profile": "https://github.com/nooynayr",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "pushpander1010",
|
||||||
|
"name": "CYBERCRUX2",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/41006191?v=4",
|
||||||
|
"profile": "https://github.com/pushpander1010",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "luismateoh",
|
||||||
|
"name": "Luis Mateo Hincapié Martinez",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/44934142?v=4",
|
||||||
|
"profile": "https://github.com/luismateoh",
|
||||||
|
"contributions": [
|
||||||
|
"translation",
|
||||||
|
"review"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "guqing",
|
||||||
|
"name": "guqing",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/38999863?v=4",
|
||||||
|
"profile": "https://guqing.io",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "sashirestela",
|
||||||
|
"name": "Sashir Estela",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/14045506?v=4",
|
||||||
|
"profile": "https://github.com/sashirestela",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "omahs",
|
||||||
|
"name": "omahs",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/73983677?v=4",
|
||||||
|
"profile": "https://github.com/omahs",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "leiferksn",
|
||||||
|
"name": "leif e.",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/4026636?v=4",
|
||||||
|
"profile": "https://github.com/leiferksn",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "junhkang",
|
||||||
|
"name": "Jun Kang",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/20232155?v=4",
|
||||||
|
"profile": "https://junhkang.tistory.com/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "KishalayP",
|
||||||
|
"name": "Kishalay Pandey",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/71012321?v=4",
|
||||||
|
"profile": "https://github.com/KishalayP",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "drishtii7",
|
||||||
|
"name": "drishtii7",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/82076566?v=4",
|
||||||
|
"profile": "https://github.com/drishtii7",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "DavidMedinaO",
|
||||||
|
"name": "David Medina Orozco",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/53974843?v=4",
|
||||||
|
"profile": "https://github.com/DavidMedinaO",
|
||||||
|
"contributions": [
|
||||||
|
"translation",
|
||||||
|
"review"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Romo4ka-bot",
|
||||||
|
"name": "Roman Leontev",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/61774094?v=4",
|
||||||
|
"profile": "https://github.com/Romo4ka-bot",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Ehspresso",
|
||||||
|
"name": "Riley",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/144370752?v=4",
|
||||||
|
"profile": "https://github.com/Ehspresso",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "k1w1dev",
|
||||||
|
"name": "k1w1dev",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/121696782?v=4",
|
||||||
|
"profile": "https://github.com/k1w1dev",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "dev-yugantar",
|
||||||
|
"name": "dev-yugantar",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/153066190?v=4",
|
||||||
|
"profile": "https://github.com/dev-yugantar",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Adelechka",
|
||||||
|
"name": "Adelya",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/65678470?v=4",
|
||||||
|
"profile": "https://github.com/Adelechka",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "gatlanagaprasanna",
|
||||||
|
"name": "gatlanagaprasanna",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/154739216?v=4",
|
||||||
|
"profile": "https://github.com/gatlanagaprasanna",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Avinash2110",
|
||||||
|
"name": "Avinash Shukla",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/37360069?v=4",
|
||||||
|
"profile": "https://github.com/Avinash2110",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Mayankchoudhary294",
|
||||||
|
"name": "Mayank Choudhary",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/97609699?v=4",
|
||||||
|
"profile": "https://github.com/Mayankchoudhary294",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "romannimets",
|
||||||
|
"name": "romannimets",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/137268574?v=4",
|
||||||
|
"profile": "https://github.com/romannimets",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Joel-Dandin",
|
||||||
|
"name": "Joel",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/60149879?v=4",
|
||||||
|
"profile": "https://github.com/Joel-Dandin",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "244Walyson",
|
||||||
|
"name": "Walyson Moises",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/125759796?v=4",
|
||||||
|
"profile": "https://github.com/244Walyson",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Xcyq",
|
||||||
|
"name": "Xcyq",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/39086666?v=4",
|
||||||
|
"profile": "https://github.com/Xcyq",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Ritabrata1080",
|
||||||
|
"name": "Ritabrata",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/60834250?v=4",
|
||||||
|
"profile": "https://github.com/Ritabrata1080",
|
||||||
|
"contributions": [
|
||||||
|
"review"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "trivikr",
|
||||||
|
"name": "Trivikram Kamat",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/16024985?v=4",
|
||||||
|
"profile": "https://github.com/trivikr",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "vvanghelle",
|
||||||
|
"name": "Vincent Vanghelle",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/3204600?v=4",
|
||||||
|
"profile": "https://github.com/vvanghelle",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "antoheri",
|
||||||
|
"name": "Antoine Héritier",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/79988396?v=4",
|
||||||
|
"profile": "https://github.com/antoheri",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "fishandsheep",
|
||||||
|
"name": "QinShower",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/43347407?v=4",
|
||||||
|
"profile": "https://github.com/fishandsheep",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "LakshyaPunyani-01",
|
||||||
|
"name": "LakshyaPunyani-01",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/103628913?v=4",
|
||||||
|
"profile": "https://github.com/LakshyaPunyani-01",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "jasonjyu",
|
||||||
|
"name": "jasonjyu",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/10333076?v=4",
|
||||||
|
"profile": "https://github.com/jasonjyu",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "jeffmorrison",
|
||||||
|
"name": "jeffmorrison",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/26047158?v=4",
|
||||||
|
"profile": "https://github.com/jeffmorrison",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "dmgodoy",
|
||||||
|
"name": "David M.",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/10840681?v=4",
|
||||||
|
"profile": "https://github.com/dmgodoy",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "apophizzz",
|
||||||
|
"name": "Patrick Kleindienst",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/12052783?v=4",
|
||||||
|
"profile": "https://github.com/apophizzz",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "proceane",
|
||||||
|
"name": "Juyeon",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/62143949?v=4",
|
||||||
|
"profile": "https://github.com/proceane",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "mammadyahyayev",
|
||||||
|
"name": "Mammad Yahyayev",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/66476643?v=4",
|
||||||
|
"profile": "https://mammadyahya.vercel.app",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "SalmaAzeem",
|
||||||
|
"name": "Salma",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/121863224?v=4",
|
||||||
|
"profile": "https://github.com/SalmaAzeem",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "CodeMaverick-143",
|
||||||
|
"name": "Arpit Sarang",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/182847716?v=4",
|
||||||
|
"profile": "https://codemaverick-143.github.io/My-Portfolio/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "mayatarek",
|
||||||
|
"name": "Maya",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/111644421?v=4",
|
||||||
|
"profile": "https://github.com/mayatarek",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "HabibaMekay",
|
||||||
|
"name": "HabibaMekay",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/133516736?v=4",
|
||||||
|
"profile": "https://github.com/HabibaMekay",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Ahmed-Taha-981",
|
||||||
|
"name": "Ahmed-Taha-981",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/122402269?v=4",
|
||||||
|
"profile": "https://github.com/Ahmed-Taha-981",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "malak-elbanna",
|
||||||
|
"name": "Malak Elbanna",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/67643605?v=4",
|
||||||
|
"profile": "https://malakelbanna.netlify.app/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "depthlending",
|
||||||
|
"name": "BiKangNing",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/164312726?v=4",
|
||||||
|
"profile": "https://github.com/depthlending",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "TarunVishwakarma1",
|
||||||
|
"name": "Tarun Vishwakarma",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/138651451?v=4",
|
||||||
|
"profile": "https://github.com/TarunVishwakarma1",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "shahdhoss",
|
||||||
|
"name": "Shahd Hossam",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/132148556?v=4",
|
||||||
|
"profile": "https://github.com/shahdhoss",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "mehdirahimi",
|
||||||
|
"name": "Mehdi Rahimi",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/24210842?v=4",
|
||||||
|
"profile": "https://mehdirahimi.github.io",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "clintaire",
|
||||||
|
"name": "Clint Airé",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/111376518?v=4",
|
||||||
|
"profile": "https://github.com/clintaire",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "darkhyper24",
|
||||||
|
"name": "darkhyper24",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/132711528?v=4",
|
||||||
|
"profile": "https://github.com/darkhyper24",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "MohanedAtef238",
|
||||||
|
"name": "Mohaned Atef",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/105852138?v=4",
|
||||||
|
"profile": "https://github.com/MohanedAtef238",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "maximevtush",
|
||||||
|
"name": "Maxim Evtush",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/154841002?v=4",
|
||||||
|
"profile": "https://github.com/maximevtush",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "hvgh88",
|
||||||
|
"name": "Harshita Vidapanakal",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/65297242?v=4",
|
||||||
|
"profile": "https://github.com/hvgh88",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "smile-ab",
|
||||||
|
"name": "smile-ab",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/202159894?v=4",
|
||||||
|
"profile": "https://github.com/smile-ab",
|
||||||
|
"contributions": [
|
||||||
|
"translation",
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Francisco-G-P",
|
||||||
|
"name": "Francisco-G-P",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/186766789?v=4",
|
||||||
|
"profile": "https://github.com/Francisco-G-P",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Duartegdm",
|
||||||
|
"name": "Gabriel Duarte",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/137895372?v=4",
|
||||||
|
"profile": "https://github.com/Duartegdm",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "DenizAltunkapan",
|
||||||
|
"name": "Deniz Altunkapan",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/93663085?v=4",
|
||||||
|
"profile": "https://github.com/DenizAltunkapan",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "johnklint81",
|
||||||
|
"name": "John Klint",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/70539458?v=4",
|
||||||
|
"profile": "https://github.com/johnklint81",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "sanurah",
|
||||||
|
"name": "Sanura Hettiarachchi",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/16178588?v=4",
|
||||||
|
"profile": "https://github.com/sanurah",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "2897robo",
|
||||||
|
"name": "Kim Gi Uk",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/31699375?v=4",
|
||||||
|
"profile": "https://github.com/2897robo",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Suchismita-Deb",
|
||||||
|
"name": "Suchismita Deb",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/68535074?v=4",
|
||||||
|
"profile": "https://github.com/Suchismita-Deb",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "ssrijan-007-sys",
|
||||||
|
"name": "ssrijan-007-sys",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/137605821?v=4",
|
||||||
|
"profile": "https://github.com/ssrijan-007-sys",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "e5LA",
|
||||||
|
"name": "e5LA",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/208197507?v=4",
|
||||||
|
"profile": "https://github.com/e5LA",
|
||||||
|
"contributions": [
|
||||||
|
"code",
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "maziyar-gerami",
|
||||||
|
"name": "Maziyar Gerami",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/122622721?v=4",
|
||||||
|
"profile": "http://maziyar-gerami.github.io/portfolio/",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "yybmion",
|
||||||
|
"name": "yoobin_mion",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/113106136?v=4",
|
||||||
|
"profile": "https://github.com/yybmion",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "ronodhirSoumik",
|
||||||
|
"name": "Soumik Sarker",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/46843689?v=4",
|
||||||
|
"profile": "https://ronodhirsoumik.github.io",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "naman-sriv",
|
||||||
|
"name": "Naman Srivastava",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/82610773?v=4",
|
||||||
|
"profile": "https://github.com/naman-sriv",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "letdtcode",
|
||||||
|
"name": "Thanh Nguyen Duc",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/92111552?v=4",
|
||||||
|
"profile": "https://github.com/letdtcode",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "skamble2",
|
||||||
|
"name": "Soham Kamble",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/121136639?v=4",
|
||||||
|
"profile": "https://github.com/skamble2",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Olexandr88",
|
||||||
|
"name": "Olexandr88",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/93856062?v=4",
|
||||||
|
"profile": "https://github.com/Olexandr88",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "nilsreichardt",
|
||||||
|
"name": "Nils Reichardt",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/24459435?v=4",
|
||||||
|
"profile": "https://github.com/nilsreichardt",
|
||||||
|
"contributions": [
|
||||||
|
"security"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "north-echo",
|
||||||
|
"name": "Christopher Lusk",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/122107484?v=4",
|
||||||
|
"profile": "http://www.northecho.dev",
|
||||||
|
"contributions": [
|
||||||
|
"security"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "dagecko",
|
||||||
|
"name": "dagecko",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/6371704?v=4",
|
||||||
|
"profile": "https://github.com/dagecko",
|
||||||
|
"contributions": [
|
||||||
|
"security"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "jackmisbach",
|
||||||
|
"name": "jackmisbach",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/183796460?v=4",
|
||||||
|
"profile": "https://github.com/jackmisbach",
|
||||||
|
"contributions": [
|
||||||
|
"security"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "avivdon",
|
||||||
|
"name": "avivdon",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/74790003?v=4",
|
||||||
|
"profile": "https://github.com/avivdon",
|
||||||
|
"contributions": [
|
||||||
|
"security"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "quantdevv",
|
||||||
|
"name": "Aditya Kumawat",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/56085648?v=4",
|
||||||
|
"profile": "https://github.com/quantdevv",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "devch37",
|
||||||
|
"name": "devch37",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/72903623?v=4",
|
||||||
|
"profile": "https://github.com/devch37",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "HY-love-sleep",
|
||||||
|
"name": "HY-love-sleep",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/73268470?v=4",
|
||||||
|
"profile": "https://github.com/HY-love-sleep",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "CMD137",
|
||||||
|
"name": "CMD137",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/56242956?v=4",
|
||||||
|
"profile": "http://www.cmd137blog.top/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "QuantumRange",
|
||||||
|
"name": "QuantumRange",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/49843948?v=4",
|
||||||
|
"profile": "https://github.com/QuantumRange",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Dhiraj-birajdar",
|
||||||
|
"name": "Dhiraj Birajdar",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/114354331?v=4",
|
||||||
|
"profile": "https://github.com/Dhiraj-birajdar",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "sieberss",
|
||||||
|
"name": "Stefan Siebers",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/178474619?v=4",
|
||||||
|
"profile": "https://github.com/sieberss",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "orbisai0security",
|
||||||
|
"name": "OrbisAI Security",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/242526317?v=4",
|
||||||
|
"profile": "https://orbisappsec.com/",
|
||||||
|
"contributions": [
|
||||||
|
"security"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "rranjangupta",
|
||||||
|
"name": "Raju Gupta",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/64011583?v=4",
|
||||||
|
"profile": "https://www.rajugupta.com/portfolio/",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "alex052525",
|
||||||
|
"name": "김정모",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/116088682?v=4",
|
||||||
|
"profile": "https://github.com/alex052525",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "AnakinYen0329",
|
||||||
|
"name": "Anakin Yen",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/122139183?v=4",
|
||||||
|
"profile": "https://github.com/AnakinYen0329",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "SrGiuliano77",
|
||||||
|
"name": "Giuliano Oliveira",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/128543464?v=4",
|
||||||
|
"profile": "https://github.com/SrGiuliano77",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "priyanshuvishwakarma273403",
|
||||||
|
"name": "Priyanshu",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/222148451?v=4",
|
||||||
|
"profile": "https://www.priyanshu-portfolio.co.in",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "arnabnandy7",
|
||||||
|
"name": "Arnab Nandy",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/5053648?v=4",
|
||||||
|
"profile": "https://github.com/arnabnandy-cognizant",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "MohamedMBG",
|
||||||
|
"name": "BAGHDAD Mohamed",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/123114744?v=4",
|
||||||
|
"profile": "https://github.com/MohamedMBG",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "AnveshSrivastava",
|
||||||
|
"name": "Anvesh Srivastava",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/170334970?v=4",
|
||||||
|
"profile": "https://github.com/AnveshSrivastava",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Mukul-Howale",
|
||||||
|
"name": "Mukul Howale",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/110479646?v=4",
|
||||||
|
"profile": "https://github.com/Mukul-Howale",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "SandhyaDevadiga",
|
||||||
|
"name": "Sandhya",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/128058717?v=4",
|
||||||
|
"profile": "https://github.com/SandhyaDevadiga",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "devikae",
|
||||||
|
"name": "dev-ikae",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/98100047?v=4",
|
||||||
|
"profile": "https://github.com/devikae",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "zanarellidev",
|
||||||
|
"name": "zanarelli",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/268068569?v=4",
|
||||||
|
"profile": "https://github.com/zanarellidev",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"contributorsPerLine": 7,
|
"contributorsPerLine": 6,
|
||||||
"projectName": "java-design-patterns",
|
"projectName": "java-design-patterns",
|
||||||
"projectOwner": "iluwatar",
|
"projectOwner": "iluwatar",
|
||||||
"repoType": "github",
|
"repoType": "github",
|
||||||
|
|||||||
+366
@@ -0,0 +1,366 @@
|
|||||||
|
#
|
||||||
|
# This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||||
|
#
|
||||||
|
# The MIT License
|
||||||
|
# Copyright © 2014-2022 Ilkka Seppälä
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
# in the Software without restriction, including without limitation the rights
|
||||||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
# copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
# THE SOFTWARE.
|
||||||
|
#
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = false
|
||||||
|
max_line_length = off
|
||||||
|
tab_width = 4
|
||||||
|
ij_continuation_indent_size = 8
|
||||||
|
ij_formatter_off_tag = @formatter:off
|
||||||
|
ij_formatter_on_tag = @formatter:on
|
||||||
|
ij_formatter_tags_enabled = true
|
||||||
|
ij_smart_tabs = false
|
||||||
|
ij_visual_guides =
|
||||||
|
ij_wrap_on_typing = false
|
||||||
|
|
||||||
|
[*.java]
|
||||||
|
indent_size = 2
|
||||||
|
max_line_length = 100
|
||||||
|
ij_continuation_indent_size = 4
|
||||||
|
ij_java_align_consecutive_assignments = false
|
||||||
|
ij_java_align_consecutive_variable_declarations = false
|
||||||
|
ij_java_align_group_field_declarations = false
|
||||||
|
ij_java_align_multiline_annotation_parameters = false
|
||||||
|
ij_java_align_multiline_array_initializer_expression = false
|
||||||
|
ij_java_align_multiline_assignment = false
|
||||||
|
ij_java_align_multiline_binary_operation = false
|
||||||
|
ij_java_align_multiline_chained_methods = false
|
||||||
|
ij_java_align_multiline_deconstruction_list_components = true
|
||||||
|
ij_java_align_multiline_extends_list = false
|
||||||
|
ij_java_align_multiline_for = true
|
||||||
|
ij_java_align_multiline_method_parentheses = false
|
||||||
|
ij_java_align_multiline_parameters = true
|
||||||
|
ij_java_align_multiline_parameters_in_calls = false
|
||||||
|
ij_java_align_multiline_parenthesized_expression = false
|
||||||
|
ij_java_align_multiline_records = true
|
||||||
|
ij_java_align_multiline_resources = true
|
||||||
|
ij_java_align_multiline_ternary_operation = false
|
||||||
|
ij_java_align_multiline_text_blocks = false
|
||||||
|
ij_java_align_multiline_throws_list = false
|
||||||
|
ij_java_align_subsequent_simple_methods = false
|
||||||
|
ij_java_align_throws_keyword = false
|
||||||
|
ij_java_align_types_in_multi_catch = true
|
||||||
|
ij_java_annotation_parameter_wrap = off
|
||||||
|
ij_java_array_initializer_new_line_after_left_brace = false
|
||||||
|
ij_java_array_initializer_right_brace_on_new_line = false
|
||||||
|
ij_java_array_initializer_wrap = normal
|
||||||
|
ij_java_assert_statement_colon_on_next_line = false
|
||||||
|
ij_java_assert_statement_wrap = normal
|
||||||
|
ij_java_assignment_wrap = normal
|
||||||
|
ij_java_binary_operation_sign_on_next_line = false
|
||||||
|
ij_java_binary_operation_wrap = normal
|
||||||
|
ij_java_blank_lines_after_anonymous_class_header = 0
|
||||||
|
ij_java_blank_lines_after_class_header = 0
|
||||||
|
ij_java_blank_lines_after_imports = 1
|
||||||
|
ij_java_blank_lines_after_package = 1
|
||||||
|
ij_java_blank_lines_around_class = 1
|
||||||
|
ij_java_blank_lines_around_field = 0
|
||||||
|
ij_java_blank_lines_around_field_in_interface = 0
|
||||||
|
ij_java_blank_lines_around_initializer = 1
|
||||||
|
ij_java_blank_lines_around_method = 1
|
||||||
|
ij_java_blank_lines_around_method_in_interface = 1
|
||||||
|
ij_java_blank_lines_before_class_end = 0
|
||||||
|
ij_java_blank_lines_before_imports = 1
|
||||||
|
ij_java_blank_lines_before_method_body = 0
|
||||||
|
ij_java_blank_lines_before_package = 1
|
||||||
|
ij_java_block_brace_style = end_of_line
|
||||||
|
ij_java_block_comment_add_space = false
|
||||||
|
ij_java_block_comment_at_first_column = true
|
||||||
|
ij_java_builder_methods =
|
||||||
|
ij_java_call_parameters_new_line_after_left_paren = false
|
||||||
|
ij_java_call_parameters_right_paren_on_new_line = false
|
||||||
|
ij_java_call_parameters_wrap = normal
|
||||||
|
ij_java_case_statement_on_separate_line = true
|
||||||
|
ij_java_catch_on_new_line = false
|
||||||
|
ij_java_class_annotation_wrap = split_into_lines
|
||||||
|
ij_java_class_brace_style = end_of_line
|
||||||
|
ij_java_class_count_to_use_import_on_demand = 999
|
||||||
|
ij_java_class_names_in_javadoc = 1
|
||||||
|
ij_java_deconstruction_list_wrap = normal
|
||||||
|
ij_java_do_not_indent_top_level_class_members = false
|
||||||
|
ij_java_do_not_wrap_after_single_annotation = false
|
||||||
|
ij_java_do_not_wrap_after_single_annotation_in_parameter = false
|
||||||
|
ij_java_do_while_brace_force = always
|
||||||
|
ij_java_doc_add_blank_line_after_description = true
|
||||||
|
ij_java_doc_add_blank_line_after_param_comments = false
|
||||||
|
ij_java_doc_add_blank_line_after_return = false
|
||||||
|
ij_java_doc_add_p_tag_on_empty_lines = true
|
||||||
|
ij_java_doc_align_exception_comments = true
|
||||||
|
ij_java_doc_align_param_comments = true
|
||||||
|
ij_java_doc_do_not_wrap_if_one_line = false
|
||||||
|
ij_java_doc_enable_formatting = true
|
||||||
|
ij_java_doc_enable_leading_asterisks = true
|
||||||
|
ij_java_doc_indent_on_continuation = false
|
||||||
|
ij_java_doc_keep_empty_lines = true
|
||||||
|
ij_java_doc_keep_empty_parameter_tag = true
|
||||||
|
ij_java_doc_keep_empty_return_tag = true
|
||||||
|
ij_java_doc_keep_empty_throws_tag = true
|
||||||
|
ij_java_doc_keep_invalid_tags = true
|
||||||
|
ij_java_doc_param_description_on_new_line = false
|
||||||
|
ij_java_doc_preserve_line_breaks = false
|
||||||
|
ij_java_doc_use_throws_not_exception_tag = true
|
||||||
|
ij_java_else_on_new_line = false
|
||||||
|
ij_java_entity_dd_prefix =
|
||||||
|
ij_java_entity_dd_suffix = EJB
|
||||||
|
ij_java_entity_eb_prefix =
|
||||||
|
ij_java_entity_eb_suffix = Bean
|
||||||
|
ij_java_entity_hi_prefix =
|
||||||
|
ij_java_entity_hi_suffix = Home
|
||||||
|
ij_java_entity_lhi_prefix = Local
|
||||||
|
ij_java_entity_lhi_suffix = Home
|
||||||
|
ij_java_entity_li_prefix = Local
|
||||||
|
ij_java_entity_li_suffix =
|
||||||
|
ij_java_entity_pk_class = java.lang.String
|
||||||
|
ij_java_entity_ri_prefix =
|
||||||
|
ij_java_entity_ri_suffix =
|
||||||
|
ij_java_entity_vo_prefix =
|
||||||
|
ij_java_entity_vo_suffix = VO
|
||||||
|
ij_java_enum_constants_wrap = normal
|
||||||
|
ij_java_extends_keyword_wrap = normal
|
||||||
|
ij_java_extends_list_wrap = normal
|
||||||
|
ij_java_field_annotation_wrap = split_into_lines
|
||||||
|
ij_java_field_name_prefix =
|
||||||
|
ij_java_field_name_suffix =
|
||||||
|
ij_java_filter_class_prefix =
|
||||||
|
ij_java_filter_class_suffix =
|
||||||
|
ij_java_filter_dd_prefix =
|
||||||
|
ij_java_filter_dd_suffix =
|
||||||
|
ij_java_finally_on_new_line = false
|
||||||
|
ij_java_for_brace_force = always
|
||||||
|
ij_java_for_statement_new_line_after_left_paren = false
|
||||||
|
ij_java_for_statement_right_paren_on_new_line = false
|
||||||
|
ij_java_for_statement_wrap = normal
|
||||||
|
ij_java_generate_final_locals = false
|
||||||
|
ij_java_generate_final_parameters = false
|
||||||
|
ij_java_if_brace_force = always
|
||||||
|
ij_java_imports_layout = $*,|,*
|
||||||
|
ij_java_indent_case_from_switch = true
|
||||||
|
ij_java_insert_inner_class_imports = false
|
||||||
|
ij_java_insert_override_annotation = true
|
||||||
|
ij_java_keep_blank_lines_before_right_brace = 2
|
||||||
|
ij_java_keep_blank_lines_between_package_declaration_and_header = 2
|
||||||
|
ij_java_keep_blank_lines_in_code = 2
|
||||||
|
ij_java_keep_blank_lines_in_declarations = 2
|
||||||
|
ij_java_keep_builder_methods_indents = false
|
||||||
|
ij_java_keep_control_statement_in_one_line = true
|
||||||
|
ij_java_keep_first_column_comment = true
|
||||||
|
ij_java_keep_indents_on_empty_lines = false
|
||||||
|
ij_java_keep_line_breaks = true
|
||||||
|
ij_java_keep_multiple_expressions_in_one_line = false
|
||||||
|
ij_java_keep_simple_blocks_in_one_line = false
|
||||||
|
ij_java_keep_simple_classes_in_one_line = false
|
||||||
|
ij_java_keep_simple_lambdas_in_one_line = false
|
||||||
|
ij_java_keep_simple_methods_in_one_line = false
|
||||||
|
ij_java_label_indent_absolute = false
|
||||||
|
ij_java_label_indent_size = 0
|
||||||
|
ij_java_lambda_brace_style = end_of_line
|
||||||
|
ij_java_layout_static_imports_separately = true
|
||||||
|
ij_java_line_comment_add_space = false
|
||||||
|
ij_java_line_comment_add_space_on_reformat = false
|
||||||
|
ij_java_line_comment_at_first_column = true
|
||||||
|
ij_java_listener_class_prefix =
|
||||||
|
ij_java_listener_class_suffix =
|
||||||
|
ij_java_local_variable_name_prefix =
|
||||||
|
ij_java_local_variable_name_suffix =
|
||||||
|
ij_java_message_dd_prefix =
|
||||||
|
ij_java_message_dd_suffix = EJB
|
||||||
|
ij_java_message_eb_prefix =
|
||||||
|
ij_java_message_eb_suffix = Bean
|
||||||
|
ij_java_method_annotation_wrap = split_into_lines
|
||||||
|
ij_java_method_brace_style = end_of_line
|
||||||
|
ij_java_method_call_chain_wrap = normal
|
||||||
|
ij_java_method_parameters_new_line_after_left_paren = false
|
||||||
|
ij_java_method_parameters_right_paren_on_new_line = false
|
||||||
|
ij_java_method_parameters_wrap = normal
|
||||||
|
ij_java_modifier_list_wrap = false
|
||||||
|
ij_java_multi_catch_types_wrap = normal
|
||||||
|
ij_java_names_count_to_use_import_on_demand = 999
|
||||||
|
ij_java_new_line_after_lparen_in_annotation = false
|
||||||
|
ij_java_new_line_after_lparen_in_deconstruction_pattern = true
|
||||||
|
ij_java_new_line_after_lparen_in_record_header = false
|
||||||
|
ij_java_packages_to_use_import_on_demand =
|
||||||
|
ij_java_parameter_annotation_wrap = normal
|
||||||
|
ij_java_parameter_name_prefix =
|
||||||
|
ij_java_parameter_name_suffix =
|
||||||
|
ij_java_parentheses_expression_new_line_after_left_paren = false
|
||||||
|
ij_java_parentheses_expression_right_paren_on_new_line = false
|
||||||
|
ij_java_place_assignment_sign_on_next_line = false
|
||||||
|
ij_java_prefer_longer_names = true
|
||||||
|
ij_java_prefer_parameters_wrap = false
|
||||||
|
ij_java_record_components_wrap = normal
|
||||||
|
ij_java_repeat_annotations =
|
||||||
|
ij_java_repeat_synchronized = true
|
||||||
|
ij_java_replace_instanceof_and_cast = false
|
||||||
|
ij_java_replace_null_check = true
|
||||||
|
ij_java_replace_sum_lambda_with_method_ref = true
|
||||||
|
ij_java_resource_list_new_line_after_left_paren = false
|
||||||
|
ij_java_resource_list_right_paren_on_new_line = false
|
||||||
|
ij_java_resource_list_wrap = normal
|
||||||
|
ij_java_rparen_on_new_line_in_annotation = false
|
||||||
|
ij_java_rparen_on_new_line_in_deconstruction_pattern = true
|
||||||
|
ij_java_rparen_on_new_line_in_record_header = false
|
||||||
|
ij_java_servlet_class_prefix =
|
||||||
|
ij_java_servlet_class_suffix =
|
||||||
|
ij_java_servlet_dd_prefix =
|
||||||
|
ij_java_servlet_dd_suffix =
|
||||||
|
ij_java_session_dd_prefix =
|
||||||
|
ij_java_session_dd_suffix = EJB
|
||||||
|
ij_java_session_eb_prefix =
|
||||||
|
ij_java_session_eb_suffix = Bean
|
||||||
|
ij_java_session_hi_prefix =
|
||||||
|
ij_java_session_hi_suffix = Home
|
||||||
|
ij_java_session_lhi_prefix = Local
|
||||||
|
ij_java_session_lhi_suffix = Home
|
||||||
|
ij_java_session_li_prefix = Local
|
||||||
|
ij_java_session_li_suffix =
|
||||||
|
ij_java_session_ri_prefix =
|
||||||
|
ij_java_session_ri_suffix =
|
||||||
|
ij_java_session_si_prefix =
|
||||||
|
ij_java_session_si_suffix = Service
|
||||||
|
ij_java_space_after_closing_angle_bracket_in_type_argument = false
|
||||||
|
ij_java_space_after_colon = true
|
||||||
|
ij_java_space_after_comma = true
|
||||||
|
ij_java_space_after_comma_in_type_arguments = true
|
||||||
|
ij_java_space_after_for_semicolon = true
|
||||||
|
ij_java_space_after_quest = true
|
||||||
|
ij_java_space_after_type_cast = true
|
||||||
|
ij_java_space_before_annotation_array_initializer_left_brace = false
|
||||||
|
ij_java_space_before_annotation_parameter_list = false
|
||||||
|
ij_java_space_before_array_initializer_left_brace = true
|
||||||
|
ij_java_space_before_catch_keyword = true
|
||||||
|
ij_java_space_before_catch_left_brace = true
|
||||||
|
ij_java_space_before_catch_parentheses = true
|
||||||
|
ij_java_space_before_class_left_brace = true
|
||||||
|
ij_java_space_before_colon = true
|
||||||
|
ij_java_space_before_colon_in_foreach = true
|
||||||
|
ij_java_space_before_comma = false
|
||||||
|
ij_java_space_before_deconstruction_list = false
|
||||||
|
ij_java_space_before_do_left_brace = true
|
||||||
|
ij_java_space_before_else_keyword = true
|
||||||
|
ij_java_space_before_else_left_brace = true
|
||||||
|
ij_java_space_before_finally_keyword = true
|
||||||
|
ij_java_space_before_finally_left_brace = true
|
||||||
|
ij_java_space_before_for_left_brace = true
|
||||||
|
ij_java_space_before_for_parentheses = true
|
||||||
|
ij_java_space_before_for_semicolon = false
|
||||||
|
ij_java_space_before_if_left_brace = true
|
||||||
|
ij_java_space_before_if_parentheses = true
|
||||||
|
ij_java_space_before_method_call_parentheses = false
|
||||||
|
ij_java_space_before_method_left_brace = true
|
||||||
|
ij_java_space_before_method_parentheses = false
|
||||||
|
ij_java_space_before_opening_angle_bracket_in_type_parameter = false
|
||||||
|
ij_java_space_before_quest = true
|
||||||
|
ij_java_space_before_switch_left_brace = true
|
||||||
|
ij_java_space_before_switch_parentheses = true
|
||||||
|
ij_java_space_before_synchronized_left_brace = true
|
||||||
|
ij_java_space_before_synchronized_parentheses = true
|
||||||
|
ij_java_space_before_try_left_brace = true
|
||||||
|
ij_java_space_before_try_parentheses = true
|
||||||
|
ij_java_space_before_type_parameter_list = false
|
||||||
|
ij_java_space_before_while_keyword = true
|
||||||
|
ij_java_space_before_while_left_brace = true
|
||||||
|
ij_java_space_before_while_parentheses = true
|
||||||
|
ij_java_space_inside_one_line_enum_braces = false
|
||||||
|
ij_java_space_within_empty_array_initializer_braces = false
|
||||||
|
ij_java_space_within_empty_method_call_parentheses = false
|
||||||
|
ij_java_space_within_empty_method_parentheses = false
|
||||||
|
ij_java_spaces_around_additive_operators = true
|
||||||
|
ij_java_spaces_around_annotation_eq = true
|
||||||
|
ij_java_spaces_around_assignment_operators = true
|
||||||
|
ij_java_spaces_around_bitwise_operators = true
|
||||||
|
ij_java_spaces_around_equality_operators = true
|
||||||
|
ij_java_spaces_around_lambda_arrow = true
|
||||||
|
ij_java_spaces_around_logical_operators = true
|
||||||
|
ij_java_spaces_around_method_ref_dbl_colon = false
|
||||||
|
ij_java_spaces_around_multiplicative_operators = true
|
||||||
|
ij_java_spaces_around_relational_operators = true
|
||||||
|
ij_java_spaces_around_shift_operators = true
|
||||||
|
ij_java_spaces_around_type_bounds_in_type_parameters = true
|
||||||
|
ij_java_spaces_around_unary_operator = false
|
||||||
|
ij_java_spaces_within_angle_brackets = false
|
||||||
|
ij_java_spaces_within_annotation_parentheses = false
|
||||||
|
ij_java_spaces_within_array_initializer_braces = false
|
||||||
|
ij_java_spaces_within_braces = false
|
||||||
|
ij_java_spaces_within_brackets = false
|
||||||
|
ij_java_spaces_within_cast_parentheses = false
|
||||||
|
ij_java_spaces_within_catch_parentheses = false
|
||||||
|
ij_java_spaces_within_deconstruction_list = false
|
||||||
|
ij_java_spaces_within_for_parentheses = false
|
||||||
|
ij_java_spaces_within_if_parentheses = false
|
||||||
|
ij_java_spaces_within_method_call_parentheses = false
|
||||||
|
ij_java_spaces_within_method_parentheses = false
|
||||||
|
ij_java_spaces_within_parentheses = false
|
||||||
|
ij_java_spaces_within_record_header = false
|
||||||
|
ij_java_spaces_within_switch_parentheses = false
|
||||||
|
ij_java_spaces_within_synchronized_parentheses = false
|
||||||
|
ij_java_spaces_within_try_parentheses = false
|
||||||
|
ij_java_spaces_within_while_parentheses = false
|
||||||
|
ij_java_special_else_if_treatment = true
|
||||||
|
ij_java_static_field_name_prefix =
|
||||||
|
ij_java_static_field_name_suffix =
|
||||||
|
ij_java_subclass_name_prefix =
|
||||||
|
ij_java_subclass_name_suffix = Impl
|
||||||
|
ij_java_ternary_operation_signs_on_next_line = false
|
||||||
|
ij_java_ternary_operation_wrap = normal
|
||||||
|
ij_java_test_name_prefix =
|
||||||
|
ij_java_test_name_suffix = Test
|
||||||
|
ij_java_throws_keyword_wrap = normal
|
||||||
|
ij_java_throws_list_wrap = normal
|
||||||
|
ij_java_use_external_annotations = false
|
||||||
|
ij_java_use_fq_class_names = false
|
||||||
|
ij_java_use_relative_indents = false
|
||||||
|
ij_java_use_single_class_imports = true
|
||||||
|
ij_java_variable_annotation_wrap = normal
|
||||||
|
ij_java_visibility = public
|
||||||
|
ij_java_while_brace_force = always
|
||||||
|
ij_java_while_on_new_line = false
|
||||||
|
ij_java_wrap_comments = false
|
||||||
|
ij_java_wrap_first_method_in_call_chain = false
|
||||||
|
ij_java_wrap_long_lines = false
|
||||||
|
|
||||||
|
[{*.markdown,*.md}]
|
||||||
|
ij_markdown_force_one_space_after_blockquote_symbol = true
|
||||||
|
ij_markdown_force_one_space_after_header_symbol = true
|
||||||
|
ij_markdown_force_one_space_after_list_bullet = true
|
||||||
|
ij_markdown_force_one_space_between_words = true
|
||||||
|
ij_markdown_format_tables = true
|
||||||
|
ij_markdown_insert_quote_arrows_on_wrap = true
|
||||||
|
ij_markdown_keep_indents_on_empty_lines = false
|
||||||
|
ij_markdown_keep_line_breaks_inside_text_blocks = true
|
||||||
|
ij_markdown_max_line_length = off
|
||||||
|
ij_markdown_max_lines_around_block_elements = 1
|
||||||
|
ij_markdown_max_lines_around_header = 1
|
||||||
|
ij_markdown_max_lines_between_paragraphs = 1
|
||||||
|
ij_markdown_min_lines_around_block_elements = 1
|
||||||
|
ij_markdown_min_lines_around_header = 1
|
||||||
|
ij_markdown_min_lines_between_paragraphs = 1
|
||||||
|
ij_markdown_wrap_text_if_long = true
|
||||||
|
ij_markdown_wrap_text_inside_blockquotes = true
|
||||||
@@ -9,17 +9,3 @@ updates:
|
|||||||
directory: "/" # Location of package manifests
|
directory: "/" # Location of package manifests
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "weekly"
|
||||||
allow:
|
|
||||||
- dependency-name: "org.springframework.boot:spring-boot-dependencies"
|
|
||||||
- dependency-name: "commons-dbcp:commons-dbcp"
|
|
||||||
- dependency-name: "net.sourceforge.htmlunit:htmlunit"
|
|
||||||
- dependency-name: "com.google.code.gson:gson"
|
|
||||||
- dependency-name: "com.google.inject:guice"
|
|
||||||
- dependency-name: "com.github.stefanbirkner:system-lambda"
|
|
||||||
- dependency-name: "org.apache.maven.plugins:maven-surefire-plugin"
|
|
||||||
- dependency-name: "org.apache.maven.plugins:maven-assembly-plugin"
|
|
||||||
- dependency-name: "org.sonarsource.scanner.maven:sonar-maven-plugin"
|
|
||||||
- dependency-name: "org.apache.maven.plugins:maven-checkstyle-plugin"
|
|
||||||
- dependency-name: "com.mycila:license-maven-plugin"
|
|
||||||
- dependency-name: "org.jacoco:jacoco-maven-plugin"
|
|
||||||
- dependency-name: "com.iluwatar.urm:urm-maven-plugin"
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
# Configuration for probot-stale - https://github.com/probot/stale
|
|
||||||
|
|
||||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
|
||||||
daysUntilStale: 60
|
|
||||||
|
|
||||||
# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
|
|
||||||
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
|
|
||||||
daysUntilClose: false
|
|
||||||
|
|
||||||
# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
|
|
||||||
onlyLabels: []
|
|
||||||
|
|
||||||
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
|
|
||||||
exemptLabels:
|
|
||||||
- "info: help wanted"
|
|
||||||
|
|
||||||
# Set to true to ignore issues in a project (defaults to false)
|
|
||||||
exemptProjects: false
|
|
||||||
|
|
||||||
# Set to true to ignore issues in a milestone (defaults to false)
|
|
||||||
exemptMilestones: false
|
|
||||||
|
|
||||||
# Set to true to ignore issues with an assignee (defaults to false)
|
|
||||||
exemptAssignees: false
|
|
||||||
|
|
||||||
# Label to use when marking as stale
|
|
||||||
staleLabel: "status: stale"
|
|
||||||
|
|
||||||
# Comment to post when marking as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had
|
|
||||||
recent activity. The issue will be unassigned if no further activity occurs. Thank you
|
|
||||||
for your contributions.
|
|
||||||
|
|
||||||
# Comment to post when removing the stale label.
|
|
||||||
# unmarkComment: >
|
|
||||||
# Your comment here.
|
|
||||||
|
|
||||||
# Comment to post when closing a stale Issue or Pull Request.
|
|
||||||
# closeComment: >
|
|
||||||
# Your comment here.
|
|
||||||
|
|
||||||
# Limit the number of actions per hour, from 1-30. Default is 30
|
|
||||||
limitPerRun: 30
|
|
||||||
|
|
||||||
# Limit to only `issues` or `pulls`
|
|
||||||
# only: issues
|
|
||||||
|
|
||||||
# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
|
|
||||||
pulls:
|
|
||||||
daysUntilStale: 30
|
|
||||||
daysUntilClose: 45
|
|
||||||
markComment: >
|
|
||||||
This pull request has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs.
|
|
||||||
closeComment: >
|
|
||||||
Closed due to inactivity. Thank you for your contributions.
|
|
||||||
|
|
||||||
# issues:
|
|
||||||
# exemptLabels:
|
|
||||||
# - confirmed
|
|
||||||
@@ -1,32 +1,3 @@
|
|||||||
#
|
|
||||||
# The MIT License
|
|
||||||
# Copyright © 2014-2021 Ilkka Seppälä
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
|
||||||
# in the Software without restriction, including without limitation the rights
|
|
||||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
# copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
# THE SOFTWARE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# This workflow will build a Java project with Maven
|
|
||||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
|
|
||||||
|
|
||||||
# We are using two jobs here for testing our code on the latest JDK 11 build as well as a more satble build version of 11.0.3
|
|
||||||
# You can see the full discussion here https://github.com/iluwatar/java-design-patterns/pull/1868#issue-1029459688
|
|
||||||
|
|
||||||
name: Java CI
|
name: Java CI
|
||||||
|
|
||||||
on:
|
on:
|
||||||
@@ -37,34 +8,34 @@ jobs:
|
|||||||
|
|
||||||
build-and-analyze:
|
build-and-analyze:
|
||||||
|
|
||||||
name: Build and Run Sonar analysis on JDK 17
|
name: Build and Run Sonar analysis on JDK 21
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
# Disabling shallow clone for improving relevancy of SonarQube reporting
|
# Disabling shallow clone for improving relevancy of SonarQube reporting
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Set up JDK 17
|
- name: Set up JDK 21
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
java-version: '17'
|
java-version: '21'
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
|
|
||||||
- name: Cache local Maven repository
|
- name: Cache local Maven repository
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.m2/repository
|
path: ~/.m2/repository
|
||||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-maven-
|
${{ runner.os }}-maven-
|
||||||
|
|
||||||
# Cache Sonar packages which as used to run analysis and collect metrics
|
# Cache Sonar packages which are used to run analysis and collect metrics
|
||||||
- name: Cache SonarCloud packages
|
- name: Cache SonarCloud packages
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.sonar/cache
|
path: ~/.sonar/cache
|
||||||
key: ${{ runner.os }}-sonar
|
key: ${{ runner.os }}-sonar
|
||||||
@@ -80,3 +51,8 @@ jobs:
|
|||||||
# These two env variables are needed for sonar analysis
|
# These two env variables are needed for sonar analysis
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||||
|
|
||||||
|
- name: Upload coverage reports to Codecov
|
||||||
|
uses: codecov/codecov-action@v5
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
@@ -1,33 +1,7 @@
|
|||||||
#
|
|
||||||
# The MIT License
|
|
||||||
# Copyright © 2014-2021 Ilkka Seppälä
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
|
||||||
# in the Software without restriction, including without limitation the rights
|
|
||||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
# copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
# THE SOFTWARE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# This workflow will build a Java project with Maven
|
|
||||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
|
|
||||||
|
|
||||||
name: Java PR Builder
|
name: Java PR Builder
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
types: [ opened, reopened, synchronize ]
|
types: [ opened, reopened, synchronize ]
|
||||||
|
|
||||||
@@ -37,47 +11,36 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
build-and-analyze:
|
build-and-analyze:
|
||||||
|
|
||||||
name: Build on JDK 17
|
name: Build on JDK 21
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
|
||||||
|
|
||||||
- name: Set up JDK 17
|
- name: Set up JDK 21
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
java-version: '17'
|
java-version: '21'
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
|
|
||||||
- name: Cache local Maven repository
|
- name: Cache local Maven repository
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.m2/repository
|
path: ~/.m2/repository
|
||||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-maven-
|
${{ runner.os }}-maven-
|
||||||
|
|
||||||
# Cache Sonar packages which as used to run analysis and collect metrics
|
|
||||||
- name: Cache SonarCloud packages
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/.sonar/cache
|
|
||||||
key: ${{ runner.os }}-sonar
|
|
||||||
restore-keys: ${{ runner.os }}-sonar
|
|
||||||
|
|
||||||
# Some tests need screen access
|
# Some tests need screen access
|
||||||
- name: Install xvfb
|
- name: Install xvfb
|
||||||
run: sudo apt-get install -y xvfb
|
run: sudo apt-get install -y xvfb
|
||||||
|
|
||||||
- name: Build with Maven and run SonarQube analysis
|
- name: Build with Maven
|
||||||
env:
|
run: xvfb-run ./mvnw clean verify
|
||||||
# Intermediate variable
|
|
||||||
HEAD_REF: ${{ github.head_ref }}
|
- name: Upload coverage reports to Codecov
|
||||||
# These two env variables are needed for sonar analysis
|
uses: codecov/codecov-action@v5
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
with:
|
||||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
run: xvfb-run ./mvnw clean verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=iluwatar -Dsonar.projectKey=iluwatar_java-design-patterns -Dsonar.pullrequest.branch=$HEAD_REF -Dsonar.pullrequest.base=${{ github.base_ref }} -Dsonar.pullrequest.key=${{ github.event.pull_request.number }}
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
name: Presubmit.ai
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened, synchronize]
|
||||||
|
pull_request_review_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
review:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Check required secrets
|
||||||
|
run: |
|
||||||
|
if [ -z "${{ secrets.LLM_API_KEY }}" ]; then
|
||||||
|
echo "Error: LLM_API_KEY secret is not configured"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- uses: presubmit/ai-reviewer@latest
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
|
||||||
|
LLM_MODEL: "gpt-5-nano"
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
name: 'Comment on stale issues and PRs'
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '30 1 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
stale-issue-message: 'This issue is stale because it has been open 60 days with no activity.'
|
||||||
|
stale-pr-message: 'This PR is stale because it has been open 60 days with no activity.'
|
||||||
|
close-issue-message: 'This issue was closed because it has been stalled for too long with no activity.'
|
||||||
|
close-pr-message: 'This PR was closed because it has been stalled for too long with no activity.'
|
||||||
|
days-before-issue-stale: 60
|
||||||
|
days-before-pr-stale: 60
|
||||||
|
days-before-issue-close: -1
|
||||||
|
days-before-pr-close: -1
|
||||||
|
exempt-issue-labels: 'info: help wanted'
|
||||||
@@ -57,3 +57,5 @@ build/
|
|||||||
#################### Java Design Patterns #######
|
#################### Java Design Patterns #######
|
||||||
etc/Java Design Patterns.urm.puml
|
etc/Java Design Patterns.urm.puml
|
||||||
serialized-entity/output.txt
|
serialized-entity/output.txt
|
||||||
|
fish1.out
|
||||||
|
fish2.out
|
||||||
-125
@@ -1,125 +0,0 @@
|
|||||||
/*
|
|
||||||
* The MIT License
|
|
||||||
* Copyright © 2014-2021 Ilkka Seppälä
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import java.net.*;
|
|
||||||
import java.io.*;
|
|
||||||
import java.nio.channels.*;
|
|
||||||
import java.util.Properties;
|
|
||||||
|
|
||||||
public class MavenWrapperDownloader {
|
|
||||||
|
|
||||||
private static final String WRAPPER_VERSION = "0.5.6";
|
|
||||||
/**
|
|
||||||
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
|
|
||||||
*/
|
|
||||||
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
|
|
||||||
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
|
|
||||||
* use instead of the default one.
|
|
||||||
*/
|
|
||||||
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
|
|
||||||
".mvn/wrapper/maven-wrapper.properties";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Path where the maven-wrapper.jar will be saved to.
|
|
||||||
*/
|
|
||||||
private static final String MAVEN_WRAPPER_JAR_PATH =
|
|
||||||
".mvn/wrapper/maven-wrapper.jar";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Name of the property which should be used to override the default download url for the wrapper.
|
|
||||||
*/
|
|
||||||
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
|
|
||||||
|
|
||||||
public static void main(String args[]) {
|
|
||||||
System.out.println("- Downloader started");
|
|
||||||
File baseDirectory = new File(args[0]);
|
|
||||||
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
|
|
||||||
|
|
||||||
// If the maven-wrapper.properties exists, read it and check if it contains a custom
|
|
||||||
// wrapperUrl parameter.
|
|
||||||
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
|
|
||||||
String url = DEFAULT_DOWNLOAD_URL;
|
|
||||||
if(mavenWrapperPropertyFile.exists()) {
|
|
||||||
FileInputStream mavenWrapperPropertyFileInputStream = null;
|
|
||||||
try {
|
|
||||||
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
|
|
||||||
Properties mavenWrapperProperties = new Properties();
|
|
||||||
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
|
|
||||||
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
|
|
||||||
} catch (IOException e) {
|
|
||||||
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
if(mavenWrapperPropertyFileInputStream != null) {
|
|
||||||
mavenWrapperPropertyFileInputStream.close();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
// Ignore ...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
System.out.println("- Downloading from: " + url);
|
|
||||||
|
|
||||||
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
|
|
||||||
if(!outputFile.getParentFile().exists()) {
|
|
||||||
if(!outputFile.getParentFile().mkdirs()) {
|
|
||||||
System.out.println(
|
|
||||||
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
|
|
||||||
try {
|
|
||||||
downloadFileFromURL(url, outputFile);
|
|
||||||
System.out.println("Done");
|
|
||||||
System.exit(0);
|
|
||||||
} catch (Throwable e) {
|
|
||||||
System.out.println("- Error downloading");
|
|
||||||
e.printStackTrace();
|
|
||||||
System.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
|
|
||||||
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
|
|
||||||
String username = System.getenv("MVNW_USERNAME");
|
|
||||||
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
|
|
||||||
Authenticator.setDefault(new Authenticator() {
|
|
||||||
@Override
|
|
||||||
protected PasswordAuthentication getPasswordAuthentication() {
|
|
||||||
return new PasswordAuthentication(username, password);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
URL website = new URL(urlString);
|
|
||||||
ReadableByteChannel rbc;
|
|
||||||
rbc = Channels.newChannel(website.openStream());
|
|
||||||
FileOutputStream fos = new FileOutputStream(destination);
|
|
||||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
|
||||||
fos.close();
|
|
||||||
rbc.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
+3
-3
@@ -6,7 +6,7 @@
|
|||||||
# "License"); you may not use this file except in compliance
|
# "License"); you may not use this file except in compliance
|
||||||
# with the License. You may obtain a copy of the License at
|
# with the License. You may obtain a copy of the License at
|
||||||
#
|
#
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
# https://www.apache.org/licenses/LICENSE-2.0
|
||||||
#
|
#
|
||||||
# Unless required by applicable law or agreed to in writing,
|
# Unless required by applicable law or agreed to in writing,
|
||||||
# software distributed under the License is distributed on an
|
# software distributed under the License is distributed on an
|
||||||
@@ -14,5 +14,5 @@
|
|||||||
# KIND, either express or implied. See the License for the
|
# KIND, either express or implied. See the License for the
|
||||||
# specific language governing permissions and limitations
|
# specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
|
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip
|
||||||
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
|
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# Java Design Patterns - Priming Context for AI Agents
|
||||||
|
|
||||||
|
## Quick Overview
|
||||||
|
- This repository is a comprehensive collection of design patterns implemented in Java.
|
||||||
|
- The project demonstrates how to solve common software design problems using standard patterns.
|
||||||
|
- The code for each pattern lives directly in this repository, alongside its explanatory README.
|
||||||
|
- These readmes are published on the java-design-patterns.com website.
|
||||||
|
- Another repository (https://github.com/iluwatar/java-design-patterns-vuepress-web) handles the deployment of the website.
|
||||||
|
|
||||||
|
## Stack
|
||||||
|
- **Java 21**: The primary programming language used for pattern implementations.
|
||||||
|
- **Maven**: Dependency management and build tool.
|
||||||
|
- **JUnit 5**: The testing framework used to verify pattern behaviors.
|
||||||
|
- **Mockito**: Used for mocking dependencies in unit tests.
|
||||||
|
- **Lombok**: Used to reduce boilerplate code (getters, setters, etc.).
|
||||||
|
- **Spotless**: Enforces consistent code formatting via Google Java Format.
|
||||||
|
|
||||||
|
## Trusted Sources
|
||||||
|
- [Java SE 21 Documentation](https://docs.oracle.com/en/java/javase/21/docs/api/)
|
||||||
|
- [Maven Official Documentation](https://maven.apache.org/guides/index.html)
|
||||||
|
- [JUnit 5 User Guide](https://junit.org/junit5/docs/current/user-guide/)
|
||||||
|
- [Project Wiki](https://github.com/iluwatar/java-design-patterns/wiki)
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
- `/pom.xml`: The root Maven configuration file that defines global dependencies and lists all pattern modules.
|
||||||
|
- `/[pattern-name]/`: Individual folders for each design pattern (e.g., `/abstract-factory`, `/builder`), acting as standalone Maven modules.
|
||||||
|
- `/[pattern-name]/src/main/java/`: Contains the actual Java implementation classes of the specific design pattern.
|
||||||
|
- `/[pattern-name]/src/test/java/`: Contains the JUnit tests verifying the pattern's behavior.
|
||||||
|
- `/[pattern-name]/README.md`: The documentation for the pattern, which gets published to the main website.
|
||||||
|
|
||||||
|
## Patterns
|
||||||
|
- Keep pattern implementations simple, atomic, and easy to understand.
|
||||||
|
- Write descriptive and meaningful names for classes, interfaces, and methods.
|
||||||
|
- Always include comprehensive unit tests for every new pattern or code modification.
|
||||||
|
- Follow the Google Java Format strictly (enforced by Spotless).
|
||||||
|
- Document the intent, explanation, and real-world usage clearly in each module's `README.md`.
|
||||||
|
|
||||||
|
## Anti-patterns
|
||||||
|
- Avoid overcomplicating patterns with unnecessary external dependencies or complex frameworks.
|
||||||
|
- Do not introduce business logic that distracts from the core mechanism of the design pattern itself.
|
||||||
|
- Submitting new patterns or features without corresponding unit tests is strictly discouraged.
|
||||||
|
- Avoid large monolithic packages; each pattern should reside in its own isolated module.
|
||||||
|
|
||||||
|
## Example Design Pattern
|
||||||
|
When a new design pattern is added to the repository, it generally follows these steps:
|
||||||
|
- **Create a Module**: Create a new folder for the pattern in the root directory (e.g., `/my-new-pattern`).
|
||||||
|
- **Update root pom.xml**: Add `<module>my-new-pattern</module>` to the `<modules>` section of the root `pom.xml`.
|
||||||
|
- **Add Module pom.xml**: Create a `pom.xml` inside the new folder that inherits from the parent project.
|
||||||
|
- **Write the Code**: Implement the pattern logic under `src/main/java/com/iluwatar/mynewpattern`, usually including an `App.java` class to demonstrate its usage.
|
||||||
|
- **Write the Tests**: Add comprehensive unit tests under `src/test/java/com/iluwatar/mynewpattern`.
|
||||||
|
- **Document**: Create a `README.md` at the root of the new module, structured with standard sections like Intent, Explanation, Class diagram, Applicability, and Real world examples.
|
||||||
+2
-3
@@ -1,4 +1,3 @@
|
|||||||
This is great you have something to contribute!
|
The project guidelines can be found in [Java Design Patterns developer wiki](https://github.com/iluwatar/java-design-patterns/wiki).
|
||||||
|
|
||||||
Before going any further please read the [wiki](https://github.com/iluwatar/java-design-patterns/wiki)
|
A good place to start is: https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute
|
||||||
with conventions and rules we used for this project.
|
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright © 2014-2021 Ilkka Seppälä
|
Copyright � 2014-2024 Ilkka Seppälä
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
@@ -1,15 +1,7 @@
|
|||||||
|
# Pull Request Template
|
||||||
|
|
||||||
Pull request title
|
## What does this PR do?
|
||||||
|
|
||||||
- Clearly and concisely describes what it does
|
<!-- Provide a short description of what this pull request does. -->
|
||||||
- Refer to the issue that it solves, if available
|
|
||||||
|
|
||||||
|
<!-- Fixes #<issue-number> (if applicable) -->
|
||||||
Pull request description
|
|
||||||
|
|
||||||
- Describes the main changes that come with the pull request
|
|
||||||
- Any relevant additional information is provided
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
> For detailed contributing instructions see https://github.com/iluwatar/java-design-patterns/wiki/01.-How-to-contribute
|
|
||||||
@@ -1,73 +1,79 @@
|
|||||||
<!-- the line below needs to be an empty line C: (its because kramdown isn't
|
# Design Patterns Implemented in Java
|
||||||
that smart and dearly wants an empty line before a heading to be able to
|
|
||||||
display it as such, e.g. website) -->
|
|
||||||
|
|
||||||
# Design patterns implemented in Java
|
[](https://github.com/iluwatar/java-design-patterns/actions/workflows/maven-ci.yml)
|
||||||
|
|
||||||

|
|
||||||
[](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md)
|
[](https://raw.githubusercontent.com/iluwatar/java-design-patterns/master/LICENSE.md)
|
||||||
[](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
|
[](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
|
||||||
[](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
|
[](https://sonarcloud.io/dashboard?id=iluwatar_java-design-patterns)
|
||||||
[](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[](https://gitter.im/iluwatar/java-design-patterns?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||||
[](#contributors-)
|
[](#contributors-)
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
Read in different language : [**zh**](localization/zh/README.md), [**ko**](localization/ko/README.md), [**fr**](localization/fr/README.md), [**tr**](localization/tr/README.md), [**ar**](localization/ar/README.md), [**es**](localization/es/README.md), [**pt**](localization/pt/README.md), [**id**](localization/id/README.md), [**ru**](localization/ru/README.md), [**de**](localization/de/README.md), [**ja**](localization/ja/README.md), [**vi**](localization/vi/README.md), [**bn**](localization/bn/README.md), [**np**](localization/ne/README.md), [**it**](localization/it/README.md), [**da**](localization/da/README.md)
|
Read in different language : [**zh**](localization/zh/README.md), [**zh-TW**](localization/zh-TW/README.md)
|
||||||
|
,[**ko**](localization/ko/README.md), [**fr**](localization/fr/README.md), [**tr**](localization/tr/README.md), [**ar**](localization/ar/README.md), [**es**](localization/es/README.md), [**pt**](localization/pt/README.md), [**id**](localization/id/README.md), [**ru**](localization/ru/README.md), [**de**](localization/de/README.md), [**ja**](localization/ja/README.md), [**vi**](localization/vi/README.md), [**bn**](localization/bn/README.md), [**np**](localization/ne/README.md), [**it**](localization/it/README.md), [**da**](localization/da/README.md)
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
# Introduction
|
# Introduction
|
||||||
|
|
||||||
Design patterns are the best, formalized practices a programmer can use to
|
Design patterns are the best, formalized practices a programmer can use to solve common problems when designing an application or system.
|
||||||
solve common problems when designing an application or system.
|
|
||||||
|
|
||||||
Design patterns can speed up the development process by providing tested, proven
|
Design patterns can speed up the development process by providing tested, proven development paradigms.
|
||||||
development paradigms.
|
|
||||||
|
|
||||||
Reusing design patterns help prevent subtle issues that cause major
|
Reusing design patterns helps prevent subtle issues that cause major problems, and it also improves code readability for coders and architects who are familiar with the patterns.
|
||||||
problems, and it also improves code readability for coders and architects who
|
|
||||||
are familiar with the patterns.
|
|
||||||
|
|
||||||
# Getting started
|
# Getting Started
|
||||||
|
|
||||||
This site showcases Java Design Patterns. The solutions have been developed by
|
This site showcases Java Design Patterns. The solutions have been developed by experienced programmers and architects from the open-source community. The patterns can be browsed by their high-level descriptions or by looking at their
|
||||||
experienced programmers and architects from the open-source community. The
|
source code. The source code examples are well commented and can be thought of as programming tutorials on how to implement a specific pattern. We use the most popular battle-proven open-source Java technologies.
|
||||||
patterns can be browsed by their high-level descriptions or by looking at their
|
|
||||||
source code. The source code examples are well commented and can be thought of as
|
|
||||||
programming tutorials on how to implement a specific pattern. We use the most
|
|
||||||
popular battle-proven open-source Java technologies.
|
|
||||||
|
|
||||||
Before you dive into the material, you should be familiar with various
|
Before you dive into the material, you should be familiar with various [Software Design Principles](https://java-design-patterns.com/principles/).
|
||||||
[Software Design Principles](https://java-design-patterns.com/principles/).
|
|
||||||
|
|
||||||
All designs should be as simple as possible. You should start with KISS, YAGNI,
|
All designs should be as simple as possible. You should start with KISS, YAGNI, and Do The Simplest Thing That Could Possibly Work principles. Complexity and patterns should only be introduced when they are needed for practical extensibility.
|
||||||
and Do The Simplest Thing That Could Possibly Work principles. Complexity and
|
|
||||||
patterns should only be introduced when they are needed for practical
|
|
||||||
extensibility.
|
|
||||||
|
|
||||||
Once you are familiar with these concepts you can start drilling down into the
|
Once you are familiar with these concepts you can start drilling down into the [available design patterns](https://java-design-patterns.com/patterns/) by any of the following approaches:
|
||||||
[available design patterns](https://java-design-patterns.com/patterns/) by any
|
|
||||||
of the following approaches
|
|
||||||
|
|
||||||
- Search for a specific pattern by name. Can't find one? Please report a new pattern [here](https://github.com/iluwatar/java-design-patterns/issues).
|
- Search for a specific pattern by name. Can't find one? Please report a new pattern [here](https://github.com/iluwatar/java-design-patterns/issues).
|
||||||
- Using tags such as `Performance`, `Gang of Four` or `Data access`.
|
- Using tags such as `Performance`, `Gang of Four` or `Data access`.
|
||||||
- Using pattern categories, `Creational`, `Behavioral`, and others.
|
- Using pattern categories, `Creational`, `Behavioral`, and others.
|
||||||
|
|
||||||
Hopefully, you find the object-oriented solutions presented on this site useful
|
Hopefully, you find the object-oriented solutions presented on this site useful in your architectures and have as much fun learning them as we had while developing them.
|
||||||
in your architectures and have as much fun learning them as we had while developing them.
|
|
||||||
|
|
||||||
# How to contribute
|
# How to Contribute
|
||||||
|
|
||||||
If you are willing to contribute to the project you will find the relevant information in
|
If you are willing to contribute to the project you will find the relevant information in our [developer wiki](https://github.com/iluwatar/java-design-patterns/wiki). We will help you and answer your questions in the [Gitter chatroom](https://gitter.im/iluwatar/java-design-patterns).
|
||||||
our [developer wiki](https://github.com/iluwatar/java-design-patterns/wiki). We will help
|
|
||||||
you and answer your questions in the [Gitter chatroom](https://gitter.im/iluwatar/java-design-patterns).
|
# The Book
|
||||||
|
|
||||||
|
The design patterns are now available as an e-book. Find out more about "Open Source Java Design Patterns" here: https://payhip.com/b/bNQFX
|
||||||
|
|
||||||
|
The project contributors can get the book for free. Contact the maintainer via [Gitter chatroom](https://gitter.im/iluwatar/java-design-patterns) or email (iluwatar (at) gmail (dot) com ). Send a message that contains your email address, Github username, and a link to an accepted pull request.
|
||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
This project is licensed under the terms of the MIT license.
|
This project is licensed under the terms of the MIT license.
|
||||||
|
|
||||||
|
# Supporters
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center" width="32%">
|
||||||
|
<a href="https://serpapi.com/?utm_source=javadesignpatterns">
|
||||||
|
<picture>
|
||||||
|
<source media="(prefers-color-scheme: dark)" srcset="assets/banner-wide.svg">
|
||||||
|
<source media="(prefers-color-scheme: light)" srcset="assets/banner-wide-black.svg">
|
||||||
|
<img src="assets/banner-wide-black.svg" width="280" alt="SerpApi logo">
|
||||||
|
</picture>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td valign="middle">
|
||||||
|
<h3><a href="https://serpapi.com/?utm_source=javadesignpatterns">SerpApi</a></h3>
|
||||||
|
<p>SerpApi is the world’s leading provider of search data, pioneering APIs that turn search engine results into structured, developer-ready information.</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
# Contributors
|
# Contributors
|
||||||
|
|
||||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||||
@@ -76,407 +82,561 @@ This project is licensed under the terms of the MIT license.
|
|||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/iluwatar"><img src="https://avatars1.githubusercontent.com/u/582346?v=4?s=100" width="100px;" alt="Ilkka Seppälä"/><br /><sub><b>Ilkka Seppälä</b></sub></a><br /><a href="#projectManagement-iluwatar" title="Project Management">📆</a> <a href="#maintenance-iluwatar" title="Maintenance">🚧</a> <a href="#content-iluwatar" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/iluwatar"><img src="https://avatars1.githubusercontent.com/u/582346?v=4?s=100" width="100px;" alt="Ilkka Seppälä"/><br /><sub><b>Ilkka Seppälä</b></sub></a><br /><a href="#projectManagement-iluwatar" title="Project Management">📆</a> <a href="#maintenance-iluwatar" title="Maintenance">🚧</a> <a href="#content-iluwatar" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://subho.xyz"><img src="https://avatars0.githubusercontent.com/u/13291222?v=4?s=100" width="100px;" alt="Subhrodip Mohanta"/><br /><sub><b>Subhrodip Mohanta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ohbus" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aohbus" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-ohbus" title="Maintenance">🚧</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://subho.xyz"><img src="https://avatars0.githubusercontent.com/u/13291222?v=4?s=100" width="100px;" alt="Subhrodip Mohanta"/><br /><sub><b>Subhrodip Mohanta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ohbus" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aohbus" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-ohbus" title="Maintenance">🚧</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/amit1307"><img src="https://avatars0.githubusercontent.com/u/23420222?v=4?s=100" width="100px;" alt="amit1307"/><br /><sub><b>amit1307</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amit1307" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/amit1307"><img src="https://avatars0.githubusercontent.com/u/23420222?v=4?s=100" width="100px;" alt="amit1307"/><br /><sub><b>amit1307</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amit1307" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/npathai"><img src="https://avatars2.githubusercontent.com/u/1792515?v=4?s=100" width="100px;" alt="Narendra Pathai"/><br /><sub><b>Narendra Pathai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=npathai" title="Code">💻</a> <a href="#ideas-npathai" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Anpathai" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/npathai"><img src="https://avatars2.githubusercontent.com/u/1792515?v=4?s=100" width="100px;" alt="Narendra Pathai"/><br /><sub><b>Narendra Pathai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=npathai" title="Code">💻</a> <a href="#ideas-npathai" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Anpathai" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fluxw42"><img src="https://avatars1.githubusercontent.com/u/1545460?v=4?s=100" width="100px;" alt="Jeroen Meulemeester"/><br /><sub><b>Jeroen Meulemeester</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fluxw42" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/fluxw42"><img src="https://avatars1.githubusercontent.com/u/1545460?v=4?s=100" width="100px;" alt="Jeroen Meulemeester"/><br /><sub><b>Jeroen Meulemeester</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fluxw42" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://www.joemccarthy.co.uk"><img src="https://avatars0.githubusercontent.com/u/4526195?v=4?s=100" width="100px;" alt="Joseph McCarthy"/><br /><sub><b>Joseph McCarthy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mikulucky" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://www.joemccarthy.co.uk"><img src="https://avatars0.githubusercontent.com/u/4526195?v=4?s=100" width="100px;" alt="Joseph McCarthy"/><br /><sub><b>Joseph McCarthy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mikulucky" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/thomasoss"><img src="https://avatars1.githubusercontent.com/u/22516154?v=4?s=100" width="100px;" alt="Thomas"/><br /><sub><b>Thomas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=thomasoss" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anuragagarwal561994"><img src="https://avatars1.githubusercontent.com/u/6075379?v=4?s=100" width="100px;" alt="Anurag Agarwal"/><br /><sub><b>Anurag Agarwal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=anuragagarwal561994" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/thomasoss"><img src="https://avatars1.githubusercontent.com/u/22516154?v=4?s=100" width="100px;" alt="Thomas"/><br /><sub><b>Thomas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=thomasoss" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://markusmo3.github.io"><img src="https://avatars1.githubusercontent.com/u/3317416?v=4?s=100" width="100px;" alt="Markus Moser"/><br /><sub><b>Markus Moser</b></sub></a><br /><a href="#design-markusmo3" title="Design">🎨</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=markusmo3" title="Code">💻</a> <a href="#ideas-markusmo3" title="Ideas, Planning, & Feedback">🤔</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/anuragagarwal561994"><img src="https://avatars1.githubusercontent.com/u/6075379?v=4?s=100" width="100px;" alt="Anurag Agarwal"/><br /><sub><b>Anurag Agarwal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=anuragagarwal561994" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/i_sabiq"><img src="https://avatars1.githubusercontent.com/u/19510920?v=4?s=100" width="100px;" alt="Sabiq Ihab"/><br /><sub><b>Sabiq Ihab</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=isabiq" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://markusmo3.github.io"><img src="https://avatars1.githubusercontent.com/u/3317416?v=4?s=100" width="100px;" alt="Markus Moser"/><br /><sub><b>Markus Moser</b></sub></a><br /><a href="#design-markusmo3" title="Design">🎨</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=markusmo3" title="Code">💻</a> <a href="#ideas-markusmo3" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://inbravo.github.io"><img src="https://avatars3.githubusercontent.com/u/5253764?v=4?s=100" width="100px;" alt="Amit Dixit"/><br /><sub><b>Amit Dixit</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=inbravo" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://twitter.com/i_sabiq"><img src="https://avatars1.githubusercontent.com/u/19510920?v=4?s=100" width="100px;" alt="Sabiq Ihab"/><br /><sub><b>Sabiq Ihab</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=isabiq" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piyushchaudhari04"><img src="https://avatars3.githubusercontent.com/u/10268029?v=4?s=100" width="100px;" alt="Piyush Kailash Chaudhari"/><br /><sub><b>Piyush Kailash Chaudhari</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=piyushchaudhari04" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://inbravo.github.io"><img src="https://avatars3.githubusercontent.com/u/5253764?v=4?s=100" width="100px;" alt="Amit Dixit"/><br /><sub><b>Amit Dixit</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=inbravo" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/joshzambales"><img src="https://avatars1.githubusercontent.com/u/8704552?v=4?s=100" width="100px;" alt="joshzambales"/><br /><sub><b>joshzambales</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=joshzambales" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/piyushchaudhari04"><img src="https://avatars3.githubusercontent.com/u/10268029?v=4?s=100" width="100px;" alt="Piyush Kailash Chaudhari"/><br /><sub><b>Piyush Kailash Chaudhari</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=piyushchaudhari04" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Crossy147"><img src="https://avatars2.githubusercontent.com/u/7272996?v=4?s=100" width="100px;" alt="Kamil Pietruszka"/><br /><sub><b>Kamil Pietruszka</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Crossy147" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://cs.joensuu.fi/~zkhayda"><img src="https://avatars2.githubusercontent.com/u/660742?v=4?s=100" width="100px;" alt="Zafar Khaydarov"/><br /><sub><b>Zafar Khaydarov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zafarella" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=zafarella" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/joshzambales"><img src="https://avatars1.githubusercontent.com/u/8704552?v=4?s=100" width="100px;" alt="joshzambales"/><br /><sub><b>joshzambales</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=joshzambales" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://kemitix.github.io/"><img src="https://avatars1.githubusercontent.com/u/1147749?v=4?s=100" width="100px;" alt="Paul Campbell"/><br /><sub><b>Paul Campbell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kemitix" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Crossy147"><img src="https://avatars2.githubusercontent.com/u/7272996?v=4?s=100" width="100px;" alt="Kamil Pietruszka"/><br /><sub><b>Kamil Pietruszka</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Crossy147" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Argyro-Sioziou"><img src="https://avatars0.githubusercontent.com/u/22822639?v=4?s=100" width="100px;" alt="Argyro Sioziou"/><br /><sub><b>Argyro Sioziou</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Argyro-Sioziou" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://cs.joensuu.fi/~zkhayda"><img src="https://avatars2.githubusercontent.com/u/660742?v=4?s=100" width="100px;" alt="Zafar Khaydarov"/><br /><sub><b>Zafar Khaydarov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zafarella" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=zafarella" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TylerMcConville"><img src="https://avatars0.githubusercontent.com/u/4946449?v=4?s=100" width="100px;" alt="TylerMcConville"/><br /><sub><b>TylerMcConville</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=TylerMcConville" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://kemitix.github.io/"><img src="https://avatars1.githubusercontent.com/u/1147749?v=4?s=100" width="100px;" alt="Paul Campbell"/><br /><sub><b>Paul Campbell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kemitix" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/saksham93"><img src="https://avatars1.githubusercontent.com/u/37399540?v=4?s=100" width="100px;" alt="saksham93"/><br /><sub><b>saksham93</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=saksham93" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Argyro-Sioziou"><img src="https://avatars0.githubusercontent.com/u/22822639?v=4?s=100" width="100px;" alt="Argyro Sioziou"/><br /><sub><b>Argyro Sioziou</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Argyro-Sioziou" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nikhilbarar"><img src="https://avatars2.githubusercontent.com/u/37332144?v=4?s=100" width="100px;" alt="nikhilbarar"/><br /><sub><b>nikhilbarar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nikhilbarar" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/TylerMcConville"><img src="https://avatars0.githubusercontent.com/u/4946449?v=4?s=100" width="100px;" alt="TylerMcConville"/><br /><sub><b>TylerMcConville</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=TylerMcConville" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://colinbut.com"><img src="https://avatars2.githubusercontent.com/u/10725674?v=4?s=100" width="100px;" alt="Colin But"/><br /><sub><b>Colin But</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=colinbut" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ruslanpa"><img src="https://avatars2.githubusercontent.com/u/1503411?v=4?s=100" width="100px;" alt="Ruslan"/><br /><sub><b>Ruslan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ruslanpa" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/saksham93"><img src="https://avatars1.githubusercontent.com/u/37399540?v=4?s=100" width="100px;" alt="saksham93"/><br /><sub><b>saksham93</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=saksham93" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JuhoKang"><img src="https://avatars1.githubusercontent.com/u/4745294?v=4?s=100" width="100px;" alt="Juho Kang"/><br /><sub><b>Juho Kang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JuhoKang" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/nikhilbarar"><img src="https://avatars2.githubusercontent.com/u/37332144?v=4?s=100" width="100px;" alt="nikhilbarar"/><br /><sub><b>nikhilbarar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nikhilbarar" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dheeraj-mummareddy"><img src="https://avatars2.githubusercontent.com/u/7002230?v=4?s=100" width="100px;" alt="Dheeraj Mummareddy"/><br /><sub><b>Dheeraj Mummareddy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dheeraj-mummareddy" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://colinbut.com"><img src="https://avatars2.githubusercontent.com/u/10725674?v=4?s=100" width="100px;" alt="Colin But"/><br /><sub><b>Colin But</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=colinbut" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.bernardosulzbach.com"><img src="https://avatars0.githubusercontent.com/u/8271090?v=4?s=100" width="100px;" alt="Bernardo Sulzbach"/><br /><sub><b>Bernardo Sulzbach</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bernardosulzbach" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ruslanpa"><img src="https://avatars2.githubusercontent.com/u/1503411?v=4?s=100" width="100px;" alt="Ruslan"/><br /><sub><b>Ruslan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ruslanpa" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/4lexis"><img src="https://avatars0.githubusercontent.com/u/19871727?v=4?s=100" width="100px;" alt="Aleksandar Dudukovic"/><br /><sub><b>Aleksandar Dudukovic</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=4lexis" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JuhoKang"><img src="https://avatars1.githubusercontent.com/u/4745294?v=4?s=100" width="100px;" alt="Juho Kang"/><br /><sub><b>Juho Kang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JuhoKang" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.yusufaytas.com"><img src="https://avatars2.githubusercontent.com/u/1049483?v=4?s=100" width="100px;" alt="Yusuf Aytaş"/><br /><sub><b>Yusuf Aytaş</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yusufaytas" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dheeraj-mummareddy"><img src="https://avatars2.githubusercontent.com/u/7002230?v=4?s=100" width="100px;" alt="Dheeraj Mummareddy"/><br /><sub><b>Dheeraj Mummareddy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dheeraj-mummareddy" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://futurehomes.hu"><img src="https://avatars2.githubusercontent.com/u/1001491?v=4?s=100" width="100px;" alt="Mihály Kuprivecz"/><br /><sub><b>Mihály Kuprivecz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qpi" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kapinuss"><img src="https://avatars0.githubusercontent.com/u/17639945?v=4?s=100" width="100px;" alt="Stanislav Kapinus"/><br /><sub><b>Stanislav Kapinus</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kapinuss" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.bernardosulzbach.com"><img src="https://avatars0.githubusercontent.com/u/8271090?v=4?s=100" width="100px;" alt="Bernardo Sulzbach"/><br /><sub><b>Bernardo Sulzbach</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bernardosulzbach" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gvsharma"><img src="https://avatars1.githubusercontent.com/u/6648152?v=4?s=100" width="100px;" alt="GVSharma"/><br /><sub><b>GVSharma</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gvsharma" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/4lexis"><img src="https://avatars0.githubusercontent.com/u/19871727?v=4?s=100" width="100px;" alt="Aleksandar Dudukovic"/><br /><sub><b>Aleksandar Dudukovic</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=4lexis" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SrdjanPaunovic"><img src="https://avatars1.githubusercontent.com/u/22815104?v=4?s=100" width="100px;" alt="Srđan Paunović"/><br /><sub><b>Srđan Paunović</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SrdjanPaunovic" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.yusufaytas.com"><img src="https://avatars2.githubusercontent.com/u/1049483?v=4?s=100" width="100px;" alt="Yusuf Aytaş"/><br /><sub><b>Yusuf Aytaş</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yusufaytas" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://sideris.xyz/"><img src="https://avatars3.githubusercontent.com/u/5484694?v=4?s=100" width="100px;" alt="Petros G. Sideris"/><br /><sub><b>Petros G. Sideris</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sideris" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://futurehomes.hu"><img src="https://avatars2.githubusercontent.com/u/1001491?v=4?s=100" width="100px;" alt="Mihály Kuprivecz"/><br /><sub><b>Mihály Kuprivecz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qpi" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/pramodgupta3/"><img src="https://avatars1.githubusercontent.com/u/2184241?v=4?s=100" width="100px;" alt="Pramod Gupta"/><br /><sub><b>Pramod Gupta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AIAmPramod" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/kapinuss"><img src="https://avatars0.githubusercontent.com/u/17639945?v=4?s=100" width="100px;" alt="Stanislav Kapinus"/><br /><sub><b>Stanislav Kapinus</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kapinuss" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://amarnath510.github.io/portfolio"><img src="https://avatars0.githubusercontent.com/u/4599623?v=4?s=100" width="100px;" alt="Amarnath Chandana"/><br /><sub><b>Amarnath Chandana</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Amarnath510" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/gvsharma"><img src="https://avatars1.githubusercontent.com/u/6648152?v=4?s=100" width="100px;" alt="GVSharma"/><br /><sub><b>GVSharma</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gvsharma" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Anurag870"><img src="https://avatars1.githubusercontent.com/u/6295975?v=4?s=100" width="100px;" alt="Anurag870"/><br /><sub><b>Anurag870</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Anurag870" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Anurag870" title="Documentation">📖</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://theerroris.me"><img src="https://avatars0.githubusercontent.com/u/1685953?v=4?s=100" width="100px;" alt="Wes Gilleland"/><br /><sub><b>Wes Gilleland</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Deathnerd" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/SrdjanPaunovic"><img src="https://avatars1.githubusercontent.com/u/22815104?v=4?s=100" width="100px;" alt="Srđan Paunović"/><br /><sub><b>Srđan Paunović</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SrdjanPaunovic" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Harshrajsinh"><img src="https://avatars2.githubusercontent.com/u/22811531?v=4?s=100" width="100px;" alt="Harshraj Thakor"/><br /><sub><b>Harshraj Thakor</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Harshrajsinh" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://sideris.xyz/"><img src="https://avatars3.githubusercontent.com/u/5484694?v=4?s=100" width="100px;" alt="Petros G. Sideris"/><br /><sub><b>Petros G. Sideris</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sideris" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MaVdbussche"><img src="https://avatars1.githubusercontent.com/u/26136934?v=4?s=100" width="100px;" alt="Martin Vandenbussche"/><br /><sub><b>Martin Vandenbussche</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MaVdbussche" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/pramodgupta3/"><img src="https://avatars1.githubusercontent.com/u/2184241?v=4?s=100" width="100px;" alt="Pramod Gupta"/><br /><sub><b>Pramod Gupta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AIAmPramod" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://alexsomai.com"><img src="https://avatars1.githubusercontent.com/u/5720977?v=4?s=100" width="100px;" alt="Alexandru Somai"/><br /><sub><b>Alexandru Somai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=alexsomai" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://amarnath510.github.io/portfolio"><img src="https://avatars0.githubusercontent.com/u/4599623?v=4?s=100" width="100px;" alt="Amarnath Chandana"/><br /><sub><b>Amarnath Chandana</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Amarnath510" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/amogozov"><img src="https://avatars3.githubusercontent.com/u/7372215?v=4?s=100" width="100px;" alt="Artur Mogozov"/><br /><sub><b>Artur Mogozov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amogozov" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Anurag870"><img src="https://avatars1.githubusercontent.com/u/6295975?v=4?s=100" width="100px;" alt="Anurag870"/><br /><sub><b>Anurag870</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Anurag870" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Anurag870" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/anthonycampbell"><img src="https://avatars3.githubusercontent.com/u/10249255?v=4?s=100" width="100px;" alt="anthony"/><br /><sub><b>anthony</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=anthonycampbell" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://theerroris.me"><img src="https://avatars0.githubusercontent.com/u/1685953?v=4?s=100" width="100px;" alt="Wes Gilleland"/><br /><sub><b>Wes Gilleland</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Deathnerd" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://ccygnus.com/"><img src="https://avatars1.githubusercontent.com/u/9342724?v=4?s=100" width="100px;" alt="Christian Cygnus"/><br /><sub><b>Christian Cygnus</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=christophercolumbusdog" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://about.me/dzmitryh"><img src="https://avatars2.githubusercontent.com/u/5390492?v=4?s=100" width="100px;" alt="Dima Gubin"/><br /><sub><b>Dima Gubin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dzmitryh" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Harshrajsinh"><img src="https://avatars2.githubusercontent.com/u/22811531?v=4?s=100" width="100px;" alt="Harshraj Thakor"/><br /><sub><b>Harshraj Thakor</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Harshrajsinh" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jjjimenez100"><img src="https://avatars3.githubusercontent.com/u/22243493?v=4?s=100" width="100px;" alt="Joshua Jimenez"/><br /><sub><b>Joshua Jimenez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jjjimenez100" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MaVdbussche"><img src="https://avatars1.githubusercontent.com/u/26136934?v=4?s=100" width="100px;" alt="Martin Vandenbussche"/><br /><sub><b>Martin Vandenbussche</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MaVdbussche" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://about.me/kaiwinter"><img src="https://avatars0.githubusercontent.com/u/110982?v=4?s=100" width="100px;" alt="Kai Winter"/><br /><sub><b>Kai Winter</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kaiwinter" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://alexsomai.com"><img src="https://avatars1.githubusercontent.com/u/5720977?v=4?s=100" width="100px;" alt="Alexandru Somai"/><br /><sub><b>Alexandru Somai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=alexsomai" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lbroman"><img src="https://avatars1.githubusercontent.com/u/86007?v=4?s=100" width="100px;" alt="lbroman"/><br /><sub><b>lbroman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=lbroman" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/amogozov"><img src="https://avatars3.githubusercontent.com/u/7372215?v=4?s=100" width="100px;" alt="Artur Mogozov"/><br /><sub><b>Artur Mogozov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amogozov" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://przemeknowak.com"><img src="https://avatars1.githubusercontent.com/u/3254609?v=4?s=100" width="100px;" alt="Przemek"/><br /><sub><b>Przemek</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pnowy" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/anthonycampbell"><img src="https://avatars3.githubusercontent.com/u/10249255?v=4?s=100" width="100px;" alt="anthony"/><br /><sub><b>anthony</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=anthonycampbell" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/prafful1"><img src="https://avatars0.githubusercontent.com/u/14350274?v=4?s=100" width="100px;" alt="Prafful Agarwal"/><br /><sub><b>Prafful Agarwal</b></sub></a><br /><a href="#content-prafful1" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://ccygnus.com/"><img src="https://avatars1.githubusercontent.com/u/9342724?v=4?s=100" width="100px;" alt="Christian Cygnus"/><br /><sub><b>Christian Cygnus</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=christophercolumbusdog" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sankypanhale"><img src="https://avatars1.githubusercontent.com/u/6478783?v=4?s=100" width="100px;" alt="Sanket Panhale"/><br /><sub><b>Sanket Panhale</b></sub></a><br /><a href="#content-sankypanhale" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/staillebois"><img src="https://avatars0.githubusercontent.com/u/23701200?v=4?s=100" width="100px;" alt="staillebois"/><br /><sub><b>staillebois</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=staillebois" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://about.me/dzmitryh"><img src="https://avatars2.githubusercontent.com/u/5390492?v=4?s=100" width="100px;" alt="Dima Gubin"/><br /><sub><b>Dima Gubin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dzmitryh" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/valdar-hu"><img src="https://avatars3.githubusercontent.com/u/17962817?v=4?s=100" width="100px;" alt="Krisztián Nagy"/><br /><sub><b>Krisztián Nagy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=valdar-hu" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jjjimenez100"><img src="https://avatars3.githubusercontent.com/u/22243493?v=4?s=100" width="100px;" alt="Joshua Jimenez"/><br /><sub><b>Joshua Jimenez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jjjimenez100" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.vanogrid.com"><img src="https://avatars0.githubusercontent.com/u/4307918?v=4?s=100" width="100px;" alt="Alexander Ivanov"/><br /><sub><b>Alexander Ivanov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vanogrid" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://about.me/kaiwinter"><img src="https://avatars0.githubusercontent.com/u/110982?v=4?s=100" width="100px;" alt="Kai Winter"/><br /><sub><b>Kai Winter</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kaiwinter" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yosfik"><img src="https://avatars3.githubusercontent.com/u/4850270?v=4?s=100" width="100px;" alt="Yosfik Alqadri"/><br /><sub><b>Yosfik Alqadri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yosfik" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/lbroman"><img src="https://avatars1.githubusercontent.com/u/86007?v=4?s=100" width="100px;" alt="lbroman"/><br /><sub><b>lbroman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=lbroman" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/7agustibm"><img src="https://avatars0.githubusercontent.com/u/8149332?v=4?s=100" width="100px;" alt="Agustí Becerra Milà"/><br /><sub><b>Agustí Becerra Milà</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=7agustibm" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://przemeknowak.com"><img src="https://avatars1.githubusercontent.com/u/3254609?v=4?s=100" width="100px;" alt="Przemek"/><br /><sub><b>Przemek</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pnowy" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Juaanma"><img src="https://avatars3.githubusercontent.com/u/7390500?v=4?s=100" width="100px;" alt="Juan Manuel Suárez"/><br /><sub><b>Juan Manuel Suárez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Juaanma" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/prafful1"><img src="https://avatars0.githubusercontent.com/u/14350274?v=4?s=100" width="100px;" alt="Prafful Agarwal"/><br /><sub><b>Prafful Agarwal</b></sub></a><br /><a href="#content-prafful1" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://www.devsedge.net/"><img src="https://avatars0.githubusercontent.com/u/9956006?v=4?s=100" width="100px;" alt="Luigi Cortese"/><br /><sub><b>Luigi Cortese</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=LuigiCortese" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Rzeposlaw"><img src="https://avatars2.githubusercontent.com/u/18425745?v=4?s=100" width="100px;" alt="Katarzyna Rzepecka"/><br /><sub><b>Katarzyna Rzepecka</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Rzeposlaw" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sankypanhale"><img src="https://avatars1.githubusercontent.com/u/6478783?v=4?s=100" width="100px;" alt="Sanket Panhale"/><br /><sub><b>Sanket Panhale</b></sub></a><br /><a href="#content-sankypanhale" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://adamski.pro"><img src="https://avatars1.githubusercontent.com/u/6537430?v=4?s=100" width="100px;" alt="adamski.pro"/><br /><sub><b>adamski.pro</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=akrystian" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/staillebois"><img src="https://avatars0.githubusercontent.com/u/23701200?v=4?s=100" width="100px;" alt="staillebois"/><br /><sub><b>staillebois</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=staillebois" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/baislsl"><img src="https://avatars0.githubusercontent.com/u/17060584?v=4?s=100" width="100px;" alt="Shengli Bai"/><br /><sub><b>Shengli Bai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=baislsl" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/valdar-hu"><img src="https://avatars3.githubusercontent.com/u/17962817?v=4?s=100" width="100px;" alt="Krisztián Nagy"/><br /><sub><b>Krisztián Nagy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=valdar-hu" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/besok"><img src="https://avatars2.githubusercontent.com/u/29834592?v=4?s=100" width="100px;" alt="Boris"/><br /><sub><b>Boris</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=besok" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.vanogrid.com"><img src="https://avatars0.githubusercontent.com/u/4307918?v=4?s=100" width="100px;" alt="Alexander Ivanov"/><br /><sub><b>Alexander Ivanov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vanogrid" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dmitraver"><img src="https://avatars3.githubusercontent.com/u/1798156?v=4?s=100" width="100px;" alt="Dmitry Avershin"/><br /><sub><b>Dmitry Avershin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dmitraver" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/yosfik"><img src="https://avatars3.githubusercontent.com/u/4850270?v=4?s=100" width="100px;" alt="Yosfik Alqadri"/><br /><sub><b>Yosfik Alqadri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yosfik" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fanofxiaofeng"><img src="https://avatars0.githubusercontent.com/u/3983683?v=4?s=100" width="100px;" alt="靳阳"/><br /><sub><b>靳阳</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fanofxiaofeng" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/7agustibm"><img src="https://avatars0.githubusercontent.com/u/8149332?v=4?s=100" width="100px;" alt="Agustí Becerra Milà"/><br /><sub><b>Agustí Becerra Milà</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=7agustibm" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hoangnam2261"><img src="https://avatars2.githubusercontent.com/u/31692990?v=4?s=100" width="100px;" alt="hoangnam2261"/><br /><sub><b>hoangnam2261</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hoangnam2261" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jarpit96"><img src="https://avatars2.githubusercontent.com/u/10098713?v=4?s=100" width="100px;" alt="Arpit Jain"/><br /><sub><b>Arpit Jain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jarpit96" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Juaanma"><img src="https://avatars3.githubusercontent.com/u/7390500?v=4?s=100" width="100px;" alt="Juan Manuel Suárez"/><br /><sub><b>Juan Manuel Suárez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Juaanma" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://joningi.net"><img src="https://avatars2.githubusercontent.com/u/6115148?v=4?s=100" width="100px;" alt="Jón Ingi Sveinbjörnsson"/><br /><sub><b>Jón Ingi Sveinbjörnsson</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=joningiwork" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://www.devsedge.net/"><img src="https://avatars0.githubusercontent.com/u/9956006?v=4?s=100" width="100px;" alt="Luigi Cortese"/><br /><sub><b>Luigi Cortese</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=LuigiCortese" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kirill-vlasov"><img src="https://avatars3.githubusercontent.com/u/16112495?v=4?s=100" width="100px;" alt="Kirill Vlasov"/><br /><sub><b>Kirill Vlasov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kirill-vlasov" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Rzeposlaw"><img src="https://avatars2.githubusercontent.com/u/18425745?v=4?s=100" width="100px;" alt="Katarzyna Rzepecka"/><br /><sub><b>Katarzyna Rzepecka</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Rzeposlaw" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://mitchell-irvin.com"><img src="https://avatars0.githubusercontent.com/u/16233245?v=4?s=100" width="100px;" alt="Mitchell Irvin"/><br /><sub><b>Mitchell Irvin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mitchellirvin" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://adamski.pro"><img src="https://avatars1.githubusercontent.com/u/6537430?v=4?s=100" width="100px;" alt="adamski.pro"/><br /><sub><b>adamski.pro</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=akrystian" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://ranjeet-floyd.github.io"><img src="https://avatars0.githubusercontent.com/u/1992972?v=4?s=100" width="100px;" alt="Ranjeet"/><br /><sub><b>Ranjeet</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ranjeet-floyd" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/baislsl"><img src="https://avatars0.githubusercontent.com/u/17060584?v=4?s=100" width="100px;" alt="Shengli Bai"/><br /><sub><b>Shengli Bai</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=baislsl" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://alwayswithme.github.io"><img src="https://avatars3.githubusercontent.com/u/3234786?v=4?s=100" width="100px;" alt="PhoenixYip"/><br /><sub><b>PhoenixYip</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Alwayswithme" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/besok"><img src="https://avatars2.githubusercontent.com/u/29834592?v=4?s=100" width="100px;" alt="Boris"/><br /><sub><b>Boris</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=besok" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MSaifAsif"><img src="https://avatars1.githubusercontent.com/u/6280554?v=4?s=100" width="100px;" alt="M Saif Asif"/><br /><sub><b>M Saif Asif</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MSaifAsif" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kanwarpreet25"><img src="https://avatars0.githubusercontent.com/u/39183641?v=4?s=100" width="100px;" alt="kanwarpreet25"/><br /><sub><b>kanwarpreet25</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kanwarpreet25" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dmitraver"><img src="https://avatars3.githubusercontent.com/u/1798156?v=4?s=100" width="100px;" alt="Dmitry Avershin"/><br /><sub><b>Dmitry Avershin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dmitraver" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://leonmak.me"><img src="https://avatars3.githubusercontent.com/u/13071508?v=4?s=100" width="100px;" alt="Leon Mak"/><br /><sub><b>Leon Mak</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=leonmak" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/fanofxiaofeng"><img src="https://avatars0.githubusercontent.com/u/3983683?v=4?s=100" width="100px;" alt="靳阳"/><br /><sub><b>靳阳</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fanofxiaofeng" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://www.wramdemark.se"><img src="https://avatars2.githubusercontent.com/u/7052193?v=4?s=100" width="100px;" alt="Per Wramdemark"/><br /><sub><b>Per Wramdemark</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=perwramdemark" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hoangnam2261"><img src="https://avatars2.githubusercontent.com/u/31692990?v=4?s=100" width="100px;" alt="hoangnam2261"/><br /><sub><b>hoangnam2261</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hoangnam2261" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/waisuan"><img src="https://avatars2.githubusercontent.com/u/10975700?v=4?s=100" width="100px;" alt="Evan Sia Wai Suan"/><br /><sub><b>Evan Sia Wai Suan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=waisuan" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jarpit96"><img src="https://avatars2.githubusercontent.com/u/10098713?v=4?s=100" width="100px;" alt="Arpit Jain"/><br /><sub><b>Arpit Jain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jarpit96" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AnaghaSasikumar"><img src="https://avatars2.githubusercontent.com/u/42939261?v=4?s=100" width="100px;" alt="AnaghaSasikumar"/><br /><sub><b>AnaghaSasikumar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AnaghaSasikumar" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://joningi.net"><img src="https://avatars2.githubusercontent.com/u/6115148?v=4?s=100" width="100px;" alt="Jón Ingi Sveinbjörnsson"/><br /><sub><b>Jón Ingi Sveinbjörnsson</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=joningiwork" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://christofferh.com"><img src="https://avatars1.githubusercontent.com/u/767643?v=4?s=100" width="100px;" alt="Christoffer Hamberg"/><br /><sub><b>Christoffer Hamberg</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=christofferh" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/kirill-vlasov"><img src="https://avatars3.githubusercontent.com/u/16112495?v=4?s=100" width="100px;" alt="Kirill Vlasov"/><br /><sub><b>Kirill Vlasov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kirill-vlasov" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dgruntz"><img src="https://avatars0.githubusercontent.com/u/1516800?v=4?s=100" width="100px;" alt="Dominik Gruntz"/><br /><sub><b>Dominik Gruntz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dgruntz" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://bitbucket.org/hannespernpeintner/"><img src="https://avatars3.githubusercontent.com/u/1679437?v=4?s=100" width="100px;" alt="Hannes"/><br /><sub><b>Hannes</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hannespernpeintner" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://mitchell-irvin.com"><img src="https://avatars0.githubusercontent.com/u/16233245?v=4?s=100" width="100px;" alt="Mitchell Irvin"/><br /><sub><b>Mitchell Irvin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mitchellirvin" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/leogtzr"><img src="https://avatars0.githubusercontent.com/u/1211969?v=4?s=100" width="100px;" alt="Leo Gutiérrez Ramírez"/><br /><sub><b>Leo Gutiérrez Ramírez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=leogtzr" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://ranjeet-floyd.github.io"><img src="https://avatars0.githubusercontent.com/u/1992972?v=4?s=100" width="100px;" alt="Ranjeet"/><br /><sub><b>Ranjeet</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ranjeet-floyd" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/npczwh"><img src="https://avatars0.githubusercontent.com/u/14066422?v=4?s=100" width="100px;" alt="Zhang WH"/><br /><sub><b>Zhang WH</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=npczwh" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://alwayswithme.github.io"><img src="https://avatars3.githubusercontent.com/u/3234786?v=4?s=100" width="100px;" alt="PhoenixYip"/><br /><sub><b>PhoenixYip</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Alwayswithme" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/oconnelc"><img src="https://avatars0.githubusercontent.com/u/1112973?v=4?s=100" width="100px;" alt="Christopher O'Connell"/><br /><sub><b>Christopher O'Connell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=oconnelc" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MSaifAsif"><img src="https://avatars1.githubusercontent.com/u/6280554?v=4?s=100" width="100px;" alt="M Saif Asif"/><br /><sub><b>M Saif Asif</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MSaifAsif" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/giorgosmav21"><img src="https://avatars2.githubusercontent.com/u/22855493?v=4?s=100" width="100px;" alt="George Mavroeidis"/><br /><sub><b>George Mavroeidis</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=giorgosmav21" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/kanwarpreet25"><img src="https://avatars0.githubusercontent.com/u/39183641?v=4?s=100" width="100px;" alt="kanwarpreet25"/><br /><sub><b>kanwarpreet25</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kanwarpreet25" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hbothra15"><img src="https://avatars1.githubusercontent.com/u/7418012?v=4?s=100" width="100px;" alt="Hemant Bothra"/><br /><sub><b>Hemant Bothra</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hbothra15" title="Code">💻</a> <a href="#design-hbothra15" title="Design">🎨</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://leonmak.me"><img src="https://avatars3.githubusercontent.com/u/13071508?v=4?s=100" width="100px;" alt="Leon Mak"/><br /><sub><b>Leon Mak</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=leonmak" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.kevinpeters.net/about/"><img src="https://avatars1.githubusercontent.com/u/12736734?v=4?s=100" width="100px;" alt="Kevin Peters"/><br /><sub><b>Kevin Peters</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=igeligel" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://llorllale.github.io/"><img src="https://avatars1.githubusercontent.com/u/2019896?v=4?s=100" width="100px;" alt="George Aristy"/><br /><sub><b>George Aristy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=llorllale" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://www.wramdemark.se"><img src="https://avatars2.githubusercontent.com/u/7052193?v=4?s=100" width="100px;" alt="Per Wramdemark"/><br /><sub><b>Per Wramdemark</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=perwramdemark" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mookkiah"><img src="https://avatars1.githubusercontent.com/u/8975264?v=4?s=100" width="100px;" alt="Mahendran Mookkiah"/><br /><sub><b>Mahendran Mookkiah</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mookkiah" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/waisuan"><img src="https://avatars2.githubusercontent.com/u/10975700?v=4?s=100" width="100px;" alt="Evan Sia Wai Suan"/><br /><sub><b>Evan Sia Wai Suan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=waisuan" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Azureyjt"><img src="https://avatars2.githubusercontent.com/u/18476317?v=4?s=100" width="100px;" alt="Azureyjt"/><br /><sub><b>Azureyjt</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Azureyjt" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/AnaghaSasikumar"><img src="https://avatars2.githubusercontent.com/u/42939261?v=4?s=100" width="100px;" alt="AnaghaSasikumar"/><br /><sub><b>AnaghaSasikumar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AnaghaSasikumar" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vehpsr"><img src="https://avatars2.githubusercontent.com/u/3133265?v=4?s=100" width="100px;" alt="gans"/><br /><sub><b>gans</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vehpsr" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://christofferh.com"><img src="https://avatars1.githubusercontent.com/u/767643?v=4?s=100" width="100px;" alt="Christoffer Hamberg"/><br /><sub><b>Christoffer Hamberg</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=christofferh" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ThatGuyWithTheHat"><img src="https://avatars0.githubusercontent.com/u/24470582?v=4?s=100" width="100px;" alt="Matt"/><br /><sub><b>Matt</b></sub></a><br /><a href="#content-ThatGuyWithTheHat" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dgruntz"><img src="https://avatars0.githubusercontent.com/u/1516800?v=4?s=100" width="100px;" alt="Dominik Gruntz"/><br /><sub><b>Dominik Gruntz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dgruntz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/gopinathlangote/"><img src="https://avatars2.githubusercontent.com/u/10210778?v=4?s=100" width="100px;" alt="Gopinath Langote"/><br /><sub><b>Gopinath Langote</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gopinath-langote" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://bitbucket.org/hannespernpeintner/"><img src="https://avatars3.githubusercontent.com/u/1679437?v=4?s=100" width="100px;" alt="Hannes"/><br /><sub><b>Hannes</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hannespernpeintner" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hoswey"><img src="https://avatars3.githubusercontent.com/u/3689445?v=4?s=100" width="100px;" alt="Hoswey"/><br /><sub><b>Hoswey</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hoswey" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/amit2103"><img src="https://avatars3.githubusercontent.com/u/7566692?v=4?s=100" width="100px;" alt="Amit Pandey"/><br /><sub><b>Amit Pandey</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amit2103" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/leogtzr"><img src="https://avatars0.githubusercontent.com/u/1211969?v=4?s=100" width="100px;" alt="Leo Gutiérrez Ramírez"/><br /><sub><b>Leo Gutiérrez Ramírez</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=leogtzr" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gwildor28"><img src="https://avatars0.githubusercontent.com/u/16000365?v=4?s=100" width="100px;" alt="gwildor28"/><br /><sub><b>gwildor28</b></sub></a><br /><a href="#content-gwildor28" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/npczwh"><img src="https://avatars0.githubusercontent.com/u/14066422?v=4?s=100" width="100px;" alt="Zhang WH"/><br /><sub><b>Zhang WH</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=npczwh" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://t.me/paul_docker"><img src="https://avatars1.githubusercontent.com/u/2404785?v=4?s=100" width="100px;" alt="田浩"/><br /><sub><b>田浩</b></sub></a><br /><a href="#content-llitfkitfk" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/oconnelc"><img src="https://avatars0.githubusercontent.com/u/1112973?v=4?s=100" width="100px;" alt="Christopher O'Connell"/><br /><sub><b>Christopher O'Connell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=oconnelc" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/StPitsios"><img src="https://avatars1.githubusercontent.com/u/6773603?v=4?s=100" width="100px;" alt="Stamatis Pitsios"/><br /><sub><b>Stamatis Pitsios</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pitsios-s" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/giorgosmav21"><img src="https://avatars2.githubusercontent.com/u/22855493?v=4?s=100" width="100px;" alt="George Mavroeidis"/><br /><sub><b>George Mavroeidis</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=giorgosmav21" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/qza"><img src="https://avatars3.githubusercontent.com/u/233149?v=4?s=100" width="100px;" alt="qza"/><br /><sub><b>qza</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qza" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hbothra15"><img src="https://avatars1.githubusercontent.com/u/7418012?v=4?s=100" width="100px;" alt="Hemant Bothra"/><br /><sub><b>Hemant Bothra</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hbothra15" title="Code">💻</a> <a href="#design-hbothra15" title="Design">🎨</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://tschis.github.io"><img src="https://avatars1.githubusercontent.com/u/20662669?v=4?s=100" width="100px;" alt="Rodolfo Forte"/><br /><sub><b>Rodolfo Forte</b></sub></a><br /><a href="#content-Tschis" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.kevinpeters.net/about/"><img src="https://avatars1.githubusercontent.com/u/12736734?v=4?s=100" width="100px;" alt="Kevin Peters"/><br /><sub><b>Kevin Peters</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=igeligel" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ankurkaushal"><img src="https://avatars2.githubusercontent.com/u/2236616?v=4?s=100" width="100px;" alt="Ankur Kaushal"/><br /><sub><b>Ankur Kaushal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ankurkaushal" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/ovidijus-okinskas/"><img src="https://avatars0.githubusercontent.com/u/20372387?v=4?s=100" width="100px;" alt="Ovidijus Okinskas"/><br /><sub><b>Ovidijus Okinskas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=okinskas" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://llorllale.github.io/"><img src="https://avatars1.githubusercontent.com/u/2019896?v=4?s=100" width="100px;" alt="George Aristy"/><br /><sub><b>George Aristy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=llorllale" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/robertt240"><img src="https://avatars1.githubusercontent.com/u/9137432?v=4?s=100" width="100px;" alt="Robert Kasperczyk"/><br /><sub><b>Robert Kasperczyk</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=robertt240" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/mookkiah"><img src="https://avatars1.githubusercontent.com/u/8975264?v=4?s=100" width="100px;" alt="Mahendran Mookkiah"/><br /><sub><b>Mahendran Mookkiah</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mookkiah" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/trautonen"><img src="https://avatars3.githubusercontent.com/u/1641063?v=4?s=100" width="100px;" alt="Tapio Rautonen"/><br /><sub><b>Tapio Rautonen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=trautonen" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Azureyjt"><img src="https://avatars2.githubusercontent.com/u/18476317?v=4?s=100" width="100px;" alt="Azureyjt"/><br /><sub><b>Azureyjt</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Azureyjt" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://vk.com/yuri.orlov"><img src="https://avatars0.githubusercontent.com/u/1595733?v=4?s=100" width="100px;" alt="Yuri Orlov"/><br /><sub><b>Yuri Orlov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yorlov" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/vehpsr"><img src="https://avatars2.githubusercontent.com/u/3133265?v=4?s=100" width="100px;" alt="gans"/><br /><sub><b>gans</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vehpsr" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/varunu28/"><img src="https://avatars0.githubusercontent.com/u/7676016?v=4?s=100" width="100px;" alt="Varun Upadhyay"/><br /><sub><b>Varun Upadhyay</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=varunu28" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ThatGuyWithTheHat"><img src="https://avatars0.githubusercontent.com/u/24470582?v=4?s=100" width="100px;" alt="Matt"/><br /><sub><b>Matt</b></sub></a><br /><a href="#content-ThatGuyWithTheHat" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/PalAditya"><img src="https://avatars2.githubusercontent.com/u/25523604?v=4?s=100" width="100px;" alt="Aditya Pal"/><br /><sub><b>Aditya Pal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=PalAditya" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/gopinathlangote/"><img src="https://avatars2.githubusercontent.com/u/10210778?v=4?s=100" width="100px;" alt="Gopinath Langote"/><br /><sub><b>Gopinath Langote</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gopinath-langote" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/grzesiekkedzior"><img src="https://avatars3.githubusercontent.com/u/23739158?v=4?s=100" width="100px;" alt="grzesiekkedzior"/><br /><sub><b>grzesiekkedzior</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=grzesiekkedzior" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Agrzesiekkedzior" title="Reviewed Pull Requests">👀</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sivasubramanim"><img src="https://avatars2.githubusercontent.com/u/51107434?v=4?s=100" width="100px;" alt="Sivasubramani M"/><br /><sub><b>Sivasubramani M</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sivasubramanim" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hoswey"><img src="https://avatars3.githubusercontent.com/u/3689445?v=4?s=100" width="100px;" alt="Hoswey"/><br /><sub><b>Hoswey</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hoswey" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/d4gg4d"><img src="https://avatars2.githubusercontent.com/u/99457?v=4?s=100" width="100px;" alt="Sami Airaksinen"/><br /><sub><b>Sami Airaksinen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=d4gg4d" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/amit2103"><img src="https://avatars3.githubusercontent.com/u/7566692?v=4?s=100" width="100px;" alt="Amit Pandey"/><br /><sub><b>Amit Pandey</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=amit2103" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vertti"><img src="https://avatars0.githubusercontent.com/u/557751?v=4?s=100" width="100px;" alt="Janne Sinivirta"/><br /><sub><b>Janne Sinivirta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vertti" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/gwildor28"><img src="https://avatars0.githubusercontent.com/u/16000365?v=4?s=100" width="100px;" alt="gwildor28"/><br /><sub><b>gwildor28</b></sub></a><br /><a href="#content-gwildor28" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bobo1239"><img src="https://avatars1.githubusercontent.com/u/2302947?v=4?s=100" width="100px;" alt="Boris-Chengbiao Zhou"/><br /><sub><b>Boris-Chengbiao Zhou</b></sub></a><br /><a href="#content-Bobo1239" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://t.me/paul_docker"><img src="https://avatars1.githubusercontent.com/u/2404785?v=4?s=100" width="100px;" alt="田浩"/><br /><sub><b>田浩</b></sub></a><br /><a href="#content-llitfkitfk" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://jahhein.github.io"><img src="https://avatars2.githubusercontent.com/u/10779515?v=4?s=100" width="100px;" alt="Jacob Hein"/><br /><sub><b>Jacob Hein</b></sub></a><br /><a href="#content-Jahhein" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://twitter.com/StPitsios"><img src="https://avatars1.githubusercontent.com/u/6773603?v=4?s=100" width="100px;" alt="Stamatis Pitsios"/><br /><sub><b>Stamatis Pitsios</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pitsios-s" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/iamrichardjones"><img src="https://avatars3.githubusercontent.com/u/14842151?v=4?s=100" width="100px;" alt="Richard Jones"/><br /><sub><b>Richard Jones</b></sub></a><br /><a href="#content-iamrichardjones" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/qza"><img src="https://avatars3.githubusercontent.com/u/233149?v=4?s=100" width="100px;" alt="qza"/><br /><sub><b>qza</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qza" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://rachelcarmena.github.io"><img src="https://avatars0.githubusercontent.com/u/22792183?v=4?s=100" width="100px;" alt="Rachel M. Carmena"/><br /><sub><b>Rachel M. Carmena</b></sub></a><br /><a href="#content-rachelcarmena" title="Content">🖋</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://zd-zero.github.io"><img src="https://avatars0.githubusercontent.com/u/21978370?v=4?s=100" width="100px;" alt="Zaerald Denze Lungos"/><br /><sub><b>Zaerald Denze Lungos</b></sub></a><br /><a href="#content-zd-zero" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://tschis.github.io"><img src="https://avatars1.githubusercontent.com/u/20662669?v=4?s=100" width="100px;" alt="Rodolfo Forte"/><br /><sub><b>Rodolfo Forte</b></sub></a><br /><a href="#content-Tschis" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://webpro.nl"><img src="https://avatars1.githubusercontent.com/u/456426?v=4?s=100" width="100px;" alt="Lars Kappert"/><br /><sub><b>Lars Kappert</b></sub></a><br /><a href="#content-webpro" title="Content">🖋</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ankurkaushal"><img src="https://avatars2.githubusercontent.com/u/2236616?v=4?s=100" width="100px;" alt="Ankur Kaushal"/><br /><sub><b>Ankur Kaushal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ankurkaushal" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://xiaod.info"><img src="https://avatars2.githubusercontent.com/u/21277644?v=4?s=100" width="100px;" alt="Mike Liu"/><br /><sub><b>Mike Liu</b></sub></a><br /><a href="#translation-xiaod-dev" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/ovidijus-okinskas/"><img src="https://avatars0.githubusercontent.com/u/20372387?v=4?s=100" width="100px;" alt="Ovidijus Okinskas"/><br /><sub><b>Ovidijus Okinskas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=okinskas" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/charlesfinley"><img src="https://avatars1.githubusercontent.com/u/6307904?v=4?s=100" width="100px;" alt="Matt Dolan"/><br /><sub><b>Matt Dolan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=charlesfinley" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Acharlesfinley" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/robertt240"><img src="https://avatars1.githubusercontent.com/u/9137432?v=4?s=100" width="100px;" alt="Robert Kasperczyk"/><br /><sub><b>Robert Kasperczyk</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=robertt240" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MananS77"><img src="https://avatars3.githubusercontent.com/u/21033516?v=4?s=100" width="100px;" alt="Manan"/><br /><sub><b>Manan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AMananS77" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/trautonen"><img src="https://avatars3.githubusercontent.com/u/1641063?v=4?s=100" width="100px;" alt="Tapio Rautonen"/><br /><sub><b>Tapio Rautonen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=trautonen" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nishant"><img src="https://avatars2.githubusercontent.com/u/15331971?v=4?s=100" width="100px;" alt="Nishant Arora"/><br /><sub><b>Nishant Arora</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nishant" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://vk.com/yuri.orlov"><img src="https://avatars0.githubusercontent.com/u/1595733?v=4?s=100" width="100px;" alt="Yuri Orlov"/><br /><sub><b>Yuri Orlov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yorlov" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/raja-peeyush-kumar-singh"><img src="https://avatars0.githubusercontent.com/u/5496024?v=4?s=100" width="100px;" alt="Peeyush"/><br /><sub><b>Peeyush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=raja-peeyush-kumar-singh" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ravening"><img src="https://avatars1.githubusercontent.com/u/10645273?v=4?s=100" width="100px;" alt="Rakesh"/><br /><sub><b>Rakesh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ravening" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aravening" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/varunu28/"><img src="https://avatars0.githubusercontent.com/u/7676016?v=4?s=100" width="100px;" alt="Varun Upadhyay"/><br /><sub><b>Varun Upadhyay</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=varunu28" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vINCENT8888801"><img src="https://avatars0.githubusercontent.com/u/8037883?v=4?s=100" width="100px;" alt="Wei Seng"/><br /><sub><b>Wei Seng</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vINCENT8888801" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/PalAditya"><img src="https://avatars2.githubusercontent.com/u/25523604?v=4?s=100" width="100px;" alt="Aditya Pal"/><br /><sub><b>Aditya Pal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=PalAditya" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/ashish-trivedi-218379135/"><img src="https://avatars3.githubusercontent.com/u/23194128?v=4?s=100" width="100px;" alt="Ashish Trivedi"/><br /><sub><b>Ashish Trivedi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ashishtrivedi16" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/grzesiekkedzior"><img src="https://avatars3.githubusercontent.com/u/23739158?v=4?s=100" width="100px;" alt="grzesiekkedzior"/><br /><sub><b>grzesiekkedzior</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=grzesiekkedzior" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Agrzesiekkedzior" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://rayyounghong.com"><img src="https://avatars1.githubusercontent.com/u/41055099?v=4?s=100" width="100px;" alt="洪月阳"/><br /><sub><b>洪月阳</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=RayYH" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sivasubramanim"><img src="https://avatars2.githubusercontent.com/u/51107434?v=4?s=100" width="100px;" alt="Sivasubramani M"/><br /><sub><b>Sivasubramani M</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sivasubramanim" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://xdvrx1.github.io/"><img src="https://avatars0.githubusercontent.com/u/47092464?v=4?s=100" width="100px;" alt="xdvrx1"/><br /><sub><b>xdvrx1</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Axdvrx1" title="Reviewed Pull Requests">👀</a> <a href="#ideas-xdvrx1" title="Ideas, Planning, & Feedback">🤔</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/d4gg4d"><img src="https://avatars2.githubusercontent.com/u/99457?v=4?s=100" width="100px;" alt="Sami Airaksinen"/><br /><sub><b>Sami Airaksinen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=d4gg4d" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nahteb"><img src="https://avatars3.githubusercontent.com/u/13121570?v=4?s=100" width="100px;" alt="Bethan Palmer"/><br /><sub><b>Bethan Palmer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nahteb" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/vertti"><img src="https://avatars0.githubusercontent.com/u/557751?v=4?s=100" width="100px;" alt="Janne Sinivirta"/><br /><sub><b>Janne Sinivirta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vertti" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ToxicDreamz"><img src="https://avatars0.githubusercontent.com/u/45225562?v=4?s=100" width="100px;" alt="Toxic Dreamz"/><br /><sub><b>Toxic Dreamz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ToxicDreamz" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://www.edycutjong.com"><img src="https://avatars1.githubusercontent.com/u/1098102?v=4?s=100" width="100px;" alt="Edy Cu Tjong"/><br /><sub><b>Edy Cu Tjong</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=edycutjong" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Bobo1239"><img src="https://avatars1.githubusercontent.com/u/2302947?v=4?s=100" width="100px;" alt="Boris-Chengbiao Zhou"/><br /><sub><b>Boris-Chengbiao Zhou</b></sub></a><br /><a href="#content-Bobo1239" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mkrzywanski"><img src="https://avatars0.githubusercontent.com/u/15279585?v=4?s=100" width="100px;" alt="Michał Krzywański"/><br /><sub><b>Michał Krzywański</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mkrzywanski" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://jahhein.github.io"><img src="https://avatars2.githubusercontent.com/u/10779515?v=4?s=100" width="100px;" alt="Jacob Hein"/><br /><sub><b>Jacob Hein</b></sub></a><br /><a href="#content-Jahhein" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.stefan-birkner.de"><img src="https://avatars1.githubusercontent.com/u/711349?v=4?s=100" width="100px;" alt="Stefan Birkner"/><br /><sub><b>Stefan Birkner</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=stefanbirkner" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/iamrichardjones"><img src="https://avatars3.githubusercontent.com/u/14842151?v=4?s=100" width="100px;" alt="Richard Jones"/><br /><sub><b>Richard Jones</b></sub></a><br /><a href="#content-iamrichardjones" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fedorskvorcov"><img src="https://avatars3.githubusercontent.com/u/43882212?v=4?s=100" width="100px;" alt="Fedor Skvorcov"/><br /><sub><b>Fedor Skvorcov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fedorskvorcov" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://rachelcarmena.github.io"><img src="https://avatars0.githubusercontent.com/u/22792183?v=4?s=100" width="100px;" alt="Rachel M. Carmena"/><br /><sub><b>Rachel M. Carmena</b></sub></a><br /><a href="#content-rachelcarmena" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/samilAyoub"><img src="https://avatars0.githubusercontent.com/u/61546990?v=4?s=100" width="100px;" alt="samilAyoub"/><br /><sub><b>samilAyoub</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=samilAyoub" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://zd-zero.github.io"><img src="https://avatars0.githubusercontent.com/u/21978370?v=4?s=100" width="100px;" alt="Zaerald Denze Lungos"/><br /><sub><b>Zaerald Denze Lungos</b></sub></a><br /><a href="#content-zd-zero" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vdlald"><img src="https://avatars0.githubusercontent.com/u/29997701?v=4?s=100" width="100px;" alt="Vladislav Golubinov"/><br /><sub><b>Vladislav Golubinov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vdlald" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://webpro.nl"><img src="https://avatars1.githubusercontent.com/u/456426?v=4?s=100" width="100px;" alt="Lars Kappert"/><br /><sub><b>Lars Kappert</b></sub></a><br /><a href="#content-webpro" title="Content">🖋</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/swarajsaaj"><img src="https://avatars2.githubusercontent.com/u/6285049?v=4?s=100" width="100px;" alt="Swaraj"/><br /><sub><b>Swaraj</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=swarajsaaj" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://christophflick.de"><img src="https://avatars0.githubusercontent.com/u/4465376?v=4?s=100" width="100px;" alt="Christoph Flick"/><br /><sub><b>Christoph Flick</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ChFlick" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://xiaod.info"><img src="https://avatars2.githubusercontent.com/u/21277644?v=4?s=100" width="100px;" alt="Mike Liu"/><br /><sub><b>Mike Liu</b></sub></a><br /><a href="#translation-xiaod-dev" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ascenio"><img src="https://avatars1.githubusercontent.com/u/7662016?v=4?s=100" width="100px;" alt="Ascênio"/><br /><sub><b>Ascênio</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AAscenio" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/charlesfinley"><img src="https://avatars1.githubusercontent.com/u/6307904?v=4?s=100" width="100px;" alt="Matt Dolan"/><br /><sub><b>Matt Dolan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=charlesfinley" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Acharlesfinley" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/domenico-sibilio/"><img src="https://avatars2.githubusercontent.com/u/24280982?v=4?s=100" width="100px;" alt="Domenico Sibilio"/><br /><sub><b>Domenico Sibilio</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dsibilio" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MananS77"><img src="https://avatars3.githubusercontent.com/u/21033516?v=4?s=100" width="100px;" alt="Manan"/><br /><sub><b>Manan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AMananS77" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/akashchandwani"><img src="https://avatars2.githubusercontent.com/u/3483277?v=4?s=100" width="100px;" alt="Akash Chandwani"/><br /><sub><b>Akash Chandwani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aakashchandwani" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/nishant"><img src="https://avatars2.githubusercontent.com/u/15331971?v=4?s=100" width="100px;" alt="Nishant Arora"/><br /><sub><b>Nishant Arora</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nishant" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://www.linkedin.com/in/manannikov"><img src="https://avatars2.githubusercontent.com/u/7019769?v=4?s=100" width="100px;" alt="Pavlo Manannikov"/><br /><sub><b>Pavlo Manannikov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=manannikov" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/raja-peeyush-kumar-singh"><img src="https://avatars0.githubusercontent.com/u/5496024?v=4?s=100" width="100px;" alt="Peeyush"/><br /><sub><b>Peeyush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=raja-peeyush-kumar-singh" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eimanip"><img src="https://avatars0.githubusercontent.com/u/20307301?v=4?s=100" width="100px;" alt="Eiman"/><br /><sub><b>Eiman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=eimanip" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ravening"><img src="https://avatars1.githubusercontent.com/u/10645273?v=4?s=100" width="100px;" alt="Rakesh"/><br /><sub><b>Rakesh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ravening" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aravening" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/OrangePants-R"><img src="https://avatars0.githubusercontent.com/u/42976136?v=4?s=100" width="100px;" alt="Rocky"/><br /><sub><b>Rocky</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=OrangePants-R" title="Documentation">📖</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://ibrahimalii.github.io/"><img src="https://avatars2.githubusercontent.com/u/21141301?v=4?s=100" width="100px;" alt="Ibrahim ali abdelghany"/><br /><sub><b>Ibrahim ali abdelghany</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AibrahimAlii" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/vINCENT8888801"><img src="https://avatars0.githubusercontent.com/u/8037883?v=4?s=100" width="100px;" alt="Wei Seng"/><br /><sub><b>Wei Seng</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vINCENT8888801" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gkulkarni2020"><img src="https://avatars3.githubusercontent.com/u/5161548?v=4?s=100" width="100px;" alt="Girish Kulkarni"/><br /><sub><b>Girish Kulkarni</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gkulkarni2020" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/ashish-trivedi-218379135/"><img src="https://avatars3.githubusercontent.com/u/23194128?v=4?s=100" width="100px;" alt="Ashish Trivedi"/><br /><sub><b>Ashish Trivedi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ashishtrivedi16" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/omk13"><img src="https://avatars0.githubusercontent.com/u/59054172?v=4?s=100" width="100px;" alt="Omar Karazoun"/><br /><sub><b>Omar Karazoun</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=omk13" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://rayyounghong.com"><img src="https://avatars1.githubusercontent.com/u/41055099?v=4?s=100" width="100px;" alt="洪月阳"/><br /><sub><b>洪月阳</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=RayYH" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jeff303"><img src="https://avatars0.githubusercontent.com/u/3521562?v=4?s=100" width="100px;" alt="Jeff Evans"/><br /><sub><b>Jeff Evans</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jeff303" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://xdvrx1.github.io/"><img src="https://avatars0.githubusercontent.com/u/47092464?v=4?s=100" width="100px;" alt="xdvrx1"/><br /><sub><b>xdvrx1</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Axdvrx1" title="Reviewed Pull Requests">👀</a> <a href="#ideas-xdvrx1" title="Ideas, Planning, & Feedback">🤔</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://viveksb007.github.io"><img src="https://avatars1.githubusercontent.com/u/12713808?v=4?s=100" width="100px;" alt="Vivek Singh"/><br /><sub><b>Vivek Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=viveksb007" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/nahteb"><img src="https://avatars3.githubusercontent.com/u/13121570?v=4?s=100" width="100px;" alt="Bethan Palmer"/><br /><sub><b>Bethan Palmer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nahteb" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/siavashsoleymani"><img src="https://avatars2.githubusercontent.com/u/18074419?v=4?s=100" width="100px;" alt="siavash"/><br /><sub><b>siavash</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=siavashsoleymani" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ToxicDreamz"><img src="https://avatars0.githubusercontent.com/u/45225562?v=4?s=100" width="100px;" alt="Toxic Dreamz"/><br /><sub><b>Toxic Dreamz</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ToxicDreamz" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ruchpeanuts"><img src="https://avatars0.githubusercontent.com/u/29301900?v=4?s=100" width="100px;" alt="ruchpeanuts"/><br /><sub><b>ruchpeanuts</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ruchpeanuts" title="Documentation">📖</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/warp125"><img src="https://avatars1.githubusercontent.com/u/48073115?v=4?s=100" width="100px;" alt="warp125"/><br /><sub><b>warp125</b></sub></a><br /><a href="#translation-warp125" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://www.edycutjong.com"><img src="https://avatars1.githubusercontent.com/u/1098102?v=4?s=100" width="100px;" alt="Edy Cu Tjong"/><br /><sub><b>Edy Cu Tjong</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=edycutjong" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://libkhadir.fr"><img src="https://avatars1.githubusercontent.com/u/45130488?v=4?s=100" width="100px;" alt="KHADIR Tayeb"/><br /><sub><b>KHADIR Tayeb</b></sub></a><br /><a href="#translation-tkhadir" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/mkrzywanski"><img src="https://avatars0.githubusercontent.com/u/15279585?v=4?s=100" width="100px;" alt="Michał Krzywański"/><br /><sub><b>Michał Krzywański</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mkrzywanski" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ignite1771"><img src="https://avatars2.githubusercontent.com/u/59446563?v=4?s=100" width="100px;" alt="ignite1771"/><br /><sub><b>ignite1771</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ignite1771" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.stefan-birkner.de"><img src="https://avatars1.githubusercontent.com/u/711349?v=4?s=100" width="100px;" alt="Stefan Birkner"/><br /><sub><b>Stefan Birkner</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=stefanbirkner" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/demirhalil"><img src="https://avatars1.githubusercontent.com/u/22895118?v=4?s=100" width="100px;" alt="Halil Demir"/><br /><sub><b>Halil Demir</b></sub></a><br /><a href="#translation-demirhalil" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/fedorskvorcov"><img src="https://avatars3.githubusercontent.com/u/43882212?v=4?s=100" width="100px;" alt="Fedor Skvorcov"/><br /><sub><b>Fedor Skvorcov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=fedorskvorcov" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rohit10000"><img src="https://avatars.githubusercontent.com/u/20845565?v=4?s=100" width="100px;" alt="Rohit Singh"/><br /><sub><b>Rohit Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=rohit10000" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/samilAyoub"><img src="https://avatars0.githubusercontent.com/u/61546990?v=4?s=100" width="100px;" alt="samilAyoub"/><br /><sub><b>samilAyoub</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=samilAyoub" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/byoungju94"><img src="https://avatars.githubusercontent.com/u/42516378?v=4?s=100" width="100px;" alt="byoungju94"/><br /><sub><b>byoungju94</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=byoungju94" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/vdlald"><img src="https://avatars0.githubusercontent.com/u/29997701?v=4?s=100" width="100px;" alt="Vladislav Golubinov"/><br /><sub><b>Vladislav Golubinov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vdlald" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/moustafafarhat"><img src="https://avatars.githubusercontent.com/u/38836727?v=4?s=100" width="100px;" alt="Moustafa Farhat"/><br /><sub><b>Moustafa Farhat</b></sub></a><br /><a href="#translation-moustafafarhat" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/richardmr36"><img src="https://avatars.githubusercontent.com/u/19147333?v=4?s=100" width="100px;" alt="Martel Richard"/><br /><sub><b>Martel Richard</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=richardmr36" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/swarajsaaj"><img src="https://avatars2.githubusercontent.com/u/6285049?v=4?s=100" width="100px;" alt="Swaraj"/><br /><sub><b>Swaraj</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=swarajsaaj" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/va1m"><img src="https://avatars.githubusercontent.com/u/17025445?v=4?s=100" width="100px;" alt="va1m"/><br /><sub><b>va1m</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=va1m" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://christophflick.de"><img src="https://avatars0.githubusercontent.com/u/4465376?v=4?s=100" width="100px;" alt="Christoph Flick"/><br /><sub><b>Christoph Flick</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ChFlick" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/noamgrinch"><img src="https://avatars.githubusercontent.com/u/31648669?v=4?s=100" width="100px;" alt="Noam Greenshtain"/><br /><sub><b>Noam Greenshtain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=noamgrinch" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Ascenio"><img src="https://avatars1.githubusercontent.com/u/7662016?v=4?s=100" width="100px;" alt="Ascênio"/><br /><sub><b>Ascênio</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AAscenio" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://xuyonghong.cn/"><img src="https://avatars.githubusercontent.com/u/14086462?v=4?s=100" width="100px;" alt="yonghong Xu"/><br /><sub><b>yonghong Xu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qfxl" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/domenico-sibilio/"><img src="https://avatars2.githubusercontent.com/u/24280982?v=4?s=100" width="100px;" alt="Domenico Sibilio"/><br /><sub><b>Domenico Sibilio</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dsibilio" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/jinisha-vora"><img src="https://avatars.githubusercontent.com/u/40777762?v=4?s=100" width="100px;" alt="jinishavora"/><br /><sub><b>jinishavora</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Ajinishavora" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=jinishavora" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/akashchandwani"><img src="https://avatars2.githubusercontent.com/u/3483277?v=4?s=100" width="100px;" alt="Akash Chandwani"/><br /><sub><b>Akash Chandwani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aakashchandwani" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eas5"><img src="https://avatars.githubusercontent.com/u/50836521?v=4?s=100" width="100px;" alt="Elvys Soares"/><br /><sub><b>Elvys Soares</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=eas5" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://www.linkedin.com/in/manannikov"><img src="https://avatars2.githubusercontent.com/u/7019769?v=4?s=100" width="100px;" alt="Pavlo Manannikov"/><br /><sub><b>Pavlo Manannikov</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=manannikov" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zWeBrain"><img src="https://avatars.githubusercontent.com/u/46642512?v=4?s=100" width="100px;" alt="zWeBrain"/><br /><sub><b>zWeBrain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zWeBrain" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://al-assad.github.io/notion/"><img src="https://avatars.githubusercontent.com/u/22493821?v=4?s=100" width="100px;" alt="余林颖"/><br /><sub><b>余林颖</b></sub></a><br /><a href="#translation-Al-assad" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/eimanip"><img src="https://avatars0.githubusercontent.com/u/20307301?v=4?s=100" width="100px;" alt="Eiman"/><br /><sub><b>Eiman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=eimanip" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/STudio26"><img src="https://avatars.githubusercontent.com/u/6988911?v=4?s=100" width="100px;" alt="Alain"/><br /><sub><b>Alain</b></sub></a><br /><a href="#translation-STudio26" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/OrangePants-R"><img src="https://avatars0.githubusercontent.com/u/42976136?v=4?s=100" width="100px;" alt="Rocky"/><br /><sub><b>Rocky</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=OrangePants-R" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DEV-VRUPER"><img src="https://avatars.githubusercontent.com/u/30525467?v=4?s=100" width="100px;" alt="VR"/><br /><sub><b>VR</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=DEV-VRUPER" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://ibrahimalii.github.io/"><img src="https://avatars2.githubusercontent.com/u/21141301?v=4?s=100" width="100px;" alt="Ibrahim ali abdelghany"/><br /><sub><b>Ibrahim ali abdelghany</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AibrahimAlii" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JackieNim"><img src="https://avatars.githubusercontent.com/u/4138836?v=4?s=100" width="100px;" alt="JackieNim"/><br /><sub><b>JackieNim</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JackieNim" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/gkulkarni2020"><img src="https://avatars3.githubusercontent.com/u/5161548?v=4?s=100" width="100px;" alt="Girish Kulkarni"/><br /><sub><b>Girish Kulkarni</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gkulkarni2020" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/EdisonE3"><img src="https://avatars.githubusercontent.com/u/52118917?v=4?s=100" width="100px;" alt="EdisonE3"/><br /><sub><b>EdisonE3</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=EdisonE3" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/omk13"><img src="https://avatars0.githubusercontent.com/u/59054172?v=4?s=100" width="100px;" alt="Omar Karazoun"/><br /><sub><b>Omar Karazoun</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=omk13" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tao-sun2"><img src="https://avatars.githubusercontent.com/u/66189688?v=4?s=100" width="100px;" alt="Tao"/><br /><sub><b>Tao</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tao-sun2" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jeff303"><img src="https://avatars0.githubusercontent.com/u/3521562?v=4?s=100" width="100px;" alt="Jeff Evans"/><br /><sub><b>Jeff Evans</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jeff303" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JuanManuelAbate"><img src="https://avatars.githubusercontent.com/u/16357060?v=4?s=100" width="100px;" alt="Juan Manuel Abate"/><br /><sub><b>Juan Manuel Abate</b></sub></a><br /><a href="#translation-JuanManuelAbate" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Xenilo137"><img src="https://avatars.githubusercontent.com/u/24865069?v=4?s=100" width="100px;" alt="Xenilo137"/><br /><sub><b>Xenilo137</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Xenilo137" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://viveksb007.github.io"><img src="https://avatars1.githubusercontent.com/u/12713808?v=4?s=100" width="100px;" alt="Vivek Singh"/><br /><sub><b>Vivek Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=viveksb007" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/souzasamuel/"><img src="https://avatars.githubusercontent.com/u/17254162?v=4?s=100" width="100px;" alt="Samuel Souza"/><br /><sub><b>Samuel Souza</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=samuelpsouza" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/siavashsoleymani"><img src="https://avatars2.githubusercontent.com/u/18074419?v=4?s=100" width="100px;" alt="siavash"/><br /><sub><b>siavash</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=siavashsoleymani" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marlo2222"><img src="https://avatars.githubusercontent.com/u/40809563?v=4?s=100" width="100px;" alt="Marlo Henrique"/><br /><sub><b>Marlo Henrique</b></sub></a><br /><a href="#translation-marlo2222" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ruchpeanuts"><img src="https://avatars0.githubusercontent.com/u/29301900?v=4?s=100" width="100px;" alt="ruchpeanuts"/><br /><sub><b>ruchpeanuts</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ruchpeanuts" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AndriyPyzh"><img src="https://avatars.githubusercontent.com/u/57706635?v=4?s=100" width="100px;" alt="AndriyPyzh"/><br /><sub><b>AndriyPyzh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AndriyPyzh" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/warp125"><img src="https://avatars1.githubusercontent.com/u/48073115?v=4?s=100" width="100px;" alt="warp125"/><br /><sub><b>warp125</b></sub></a><br /><a href="#translation-warp125" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/karthikbhat13"><img src="https://avatars.githubusercontent.com/u/22431014?v=4?s=100" width="100px;" alt="karthikbhat13"/><br /><sub><b>karthikbhat13</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=karthikbhat13" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://libkhadir.fr"><img src="https://avatars1.githubusercontent.com/u/45130488?v=4?s=100" width="100px;" alt="KHADIR Tayeb"/><br /><sub><b>KHADIR Tayeb</b></sub></a><br /><a href="#translation-tkhadir" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mortezaadi"><img src="https://avatars.githubusercontent.com/u/1329687?v=4?s=100" width="100px;" alt="Morteza Adigozalpour"/><br /><sub><b>Morteza Adigozalpour</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mortezaadi" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ignite1771"><img src="https://avatars2.githubusercontent.com/u/59446563?v=4?s=100" width="100px;" alt="ignite1771"/><br /><sub><b>ignite1771</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ignite1771" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://stackoverflow.com/users/308565/nagaraj-tantri"><img src="https://avatars.githubusercontent.com/u/3784194?v=4?s=100" width="100px;" alt="Nagaraj Tantri"/><br /><sub><b>Nagaraj Tantri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tan31989" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/frascu"><img src="https://avatars.githubusercontent.com/u/7107651?v=4?s=100" width="100px;" alt="Francesco Scuccimarri"/><br /><sub><b>Francesco Scuccimarri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=frascu" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/demirhalil"><img src="https://avatars1.githubusercontent.com/u/22895118?v=4?s=100" width="100px;" alt="Halil Demir"/><br /><sub><b>Halil Demir</b></sub></a><br /><a href="#translation-demirhalil" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Conhan93"><img src="https://avatars.githubusercontent.com/u/71334757?v=4?s=100" width="100px;" alt="Conny Hansson"/><br /><sub><b>Conny Hansson</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Conhan93" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/rohit10000"><img src="https://avatars.githubusercontent.com/u/20845565?v=4?s=100" width="100px;" alt="Rohit Singh"/><br /><sub><b>Rohit Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=rohit10000" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://muklasr.medium.com"><img src="https://avatars.githubusercontent.com/u/43443753?v=4?s=100" width="100px;" alt="Muklas Rahmanto"/><br /><sub><b>Muklas Rahmanto</b></sub></a><br /><a href="#translation-muklasr" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/byoungju94"><img src="https://avatars.githubusercontent.com/u/42516378?v=4?s=100" width="100px;" alt="byoungju94"/><br /><sub><b>byoungju94</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=byoungju94" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VxDxK"><img src="https://avatars.githubusercontent.com/u/38704817?v=4?s=100" width="100px;" alt="Vadim"/><br /><sub><b>Vadim</b></sub></a><br /><a href="#translation-VxDxK" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/moustafafarhat"><img src="https://avatars.githubusercontent.com/u/38836727?v=4?s=100" width="100px;" alt="Moustafa Farhat"/><br /><sub><b>Moustafa Farhat</b></sub></a><br /><a href="#translation-moustafafarhat" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sims-keshri"><img src="https://avatars.githubusercontent.com/u/62168475?v=4?s=100" width="100px;" alt="Simran Keshri"/><br /><sub><b>Simran Keshri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sims-keshri" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/richardmr36"><img src="https://avatars.githubusercontent.com/u/19147333?v=4?s=100" width="100px;" alt="Martel Richard"/><br /><sub><b>Martel Richard</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=richardmr36" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://programacionymas.com"><img src="https://avatars.githubusercontent.com/u/3101238?v=4?s=100" width="100px;" alt="JCarlos"/><br /><sub><b>JCarlos</b></sub></a><br /><a href="#translation-JCarlosR" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/va1m"><img src="https://avatars.githubusercontent.com/u/17025445?v=4?s=100" width="100px;" alt="va1m"/><br /><sub><b>va1m</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=va1m" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.mrmoshkel.ir"><img src="https://avatars.githubusercontent.com/u/60359433?v=4?s=100" width="100px;" alt="Ali Ghasemi"/><br /><sub><b>Ali Ghasemi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Dev-AliGhasemi" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://carlfx.wordpress.com"><img src="https://avatars.githubusercontent.com/u/1594624?v=4?s=100" width="100px;" alt="Carl Dea"/><br /><sub><b>Carl Dea</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=carldea" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/noamgrinch"><img src="https://avatars.githubusercontent.com/u/31648669?v=4?s=100" width="100px;" alt="Noam Greenshtain"/><br /><sub><b>Noam Greenshtain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=noamgrinch" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mozartuss"><img src="https://avatars.githubusercontent.com/u/32893711?v=4?s=100" width="100px;" alt="Mozartus"/><br /><sub><b>Mozartus</b></sub></a><br /><a href="#translation-Mozartuss" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://xuyonghong.cn/"><img src="https://avatars.githubusercontent.com/u/14086462?v=4?s=100" width="100px;" alt="yonghong Xu"/><br /><sub><b>yonghong Xu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=qfxl" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ManviGoel26"><img src="https://avatars.githubusercontent.com/u/55682355?v=4?s=100" width="100px;" alt="Manvi Goel"/><br /><sub><b>Manvi Goel</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ManviGoel26" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/jinisha-vora"><img src="https://avatars.githubusercontent.com/u/40777762?v=4?s=100" width="100px;" alt="jinishavora"/><br /><sub><b>jinishavora</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Ajinishavora" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=jinishavora" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/blueberry404"><img src="https://avatars.githubusercontent.com/u/39243539?v=4?s=100" width="100px;" alt="Anum Amin"/><br /><sub><b>Anum Amin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=blueberry404" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/eas5"><img src="https://avatars.githubusercontent.com/u/50836521?v=4?s=100" width="100px;" alt="Elvys Soares"/><br /><sub><b>Elvys Soares</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=eas5" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://uh-zz.github.io/blog/"><img src="https://avatars.githubusercontent.com/u/47747828?v=4?s=100" width="100px;" alt="Reo Uehara"/><br /><sub><b>Reo Uehara</b></sub></a><br /><a href="#translation-uh-zz" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/zWeBrain"><img src="https://avatars.githubusercontent.com/u/46642512?v=4?s=100" width="100px;" alt="zWeBrain"/><br /><sub><b>zWeBrain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zWeBrain" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Fiordy"><img src="https://avatars.githubusercontent.com/u/53420573?v=4?s=100" width="100px;" alt="Fiordy"/><br /><sub><b>Fiordy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Fiordy" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://al-assad.github.io/notion/"><img src="https://avatars.githubusercontent.com/u/22493821?v=4?s=100" width="100px;" alt="余林颖"/><br /><sub><b>余林颖</b></sub></a><br /><a href="#translation-Al-assad" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harshalkh"><img src="https://avatars.githubusercontent.com/u/37841724?v=4?s=100" width="100px;" alt="Harshal"/><br /><sub><b>Harshal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=harshalkh" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/abhinav-vashisth-06613b208/"><img src="https://avatars.githubusercontent.com/u/89785800?v=4?s=100" width="100px;" alt="Abhinav Vashisth"/><br /><sub><b>Abhinav Vashisth</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vashisthabhinav" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/STudio26"><img src="https://avatars.githubusercontent.com/u/6988911?v=4?s=100" width="100px;" alt="Alain"/><br /><sub><b>Alain</b></sub></a><br /><a href="#translation-STudio26" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://no website"><img src="https://avatars.githubusercontent.com/u/47126749?v=4?s=100" width="100px;" alt="Kevin"/><br /><sub><b>Kevin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AKevinyl3" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Kevinyl3" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/DEV-VRUPER"><img src="https://avatars.githubusercontent.com/u/30525467?v=4?s=100" width="100px;" alt="VR"/><br /><sub><b>VR</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=DEV-VRUPER" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Shrirang97"><img src="https://avatars.githubusercontent.com/u/28738668?v=4?s=100" width="100px;" alt="Shrirang"/><br /><sub><b>Shrirang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AShrirang97" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Shrirang97" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JackieNim"><img src="https://avatars.githubusercontent.com/u/4138836?v=4?s=100" width="100px;" alt="JackieNim"/><br /><sub><b>JackieNim</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JackieNim" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/interactwithankush"><img src="https://avatars.githubusercontent.com/u/18613127?v=4?s=100" width="100px;" alt="interactwithankush"/><br /><sub><b>interactwithankush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=interactwithankush" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/EdisonE3"><img src="https://avatars.githubusercontent.com/u/52118917?v=4?s=100" width="100px;" alt="EdisonE3"/><br /><sub><b>EdisonE3</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=EdisonE3" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yuhangbin"><img src="https://avatars.githubusercontent.com/u/17566866?v=4?s=100" width="100px;" alt="CharlieYu"/><br /><sub><b>CharlieYu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yuhangbin" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/tao-sun2"><img src="https://avatars.githubusercontent.com/u/66189688?v=4?s=100" width="100px;" alt="Tao"/><br /><sub><b>Tao</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tao-sun2" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Leisterbecker"><img src="https://avatars.githubusercontent.com/u/20650323?v=4?s=100" width="100px;" alt="Leisterbecker"/><br /><sub><b>Leisterbecker</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Leisterbecker" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JuanManuelAbate"><img src="https://avatars.githubusercontent.com/u/16357060?v=4?s=100" width="100px;" alt="Juan Manuel Abate"/><br /><sub><b>Juan Manuel Abate</b></sub></a><br /><a href="#translation-JuanManuelAbate" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://rosaecrucis.cn"><img src="https://avatars.githubusercontent.com/u/35420129?v=4?s=100" width="100px;" alt="DragonDreamer"/><br /><sub><b>DragonDreamer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=castleKing1997" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ShivanshCharak"><img src="https://avatars.githubusercontent.com/u/96943825?v=4?s=100" width="100px;" alt="ShivanshCharak"/><br /><sub><b>ShivanshCharak</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ShivanshCharak" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Xenilo137"><img src="https://avatars.githubusercontent.com/u/24865069?v=4?s=100" width="100px;" alt="Xenilo137"/><br /><sub><b>Xenilo137</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Xenilo137" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HattoriHenzo"><img src="https://avatars.githubusercontent.com/u/5141285?v=4?s=100" width="100px;" alt="HattoriHenzo"/><br /><sub><b>HattoriHenzo</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HattoriHenzo" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/souzasamuel/"><img src="https://avatars.githubusercontent.com/u/17254162?v=4?s=100" width="100px;" alt="Samuel Souza"/><br /><sub><b>Samuel Souza</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=samuelpsouza" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=samuelpsouza" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://arnabsen.bio.link"><img src="https://avatars.githubusercontent.com/u/51032928?v=4?s=100" width="100px;" alt="Arnab Sen"/><br /><sub><b>Arnab Sen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=arnabsen1729" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/marlo2222"><img src="https://avatars.githubusercontent.com/u/40809563?v=4?s=100" width="100px;" alt="Marlo Henrique"/><br /><sub><b>Marlo Henrique</b></sub></a><br /><a href="#translation-marlo2222" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://javaforlife.wordpress.com/"><img src="https://avatars.githubusercontent.com/u/1470114?v=4?s=100" width="100px;" alt="MohanaRao SV"/><br /><sub><b>MohanaRao SV</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mohanaraosv" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/AndriyPyzh"><img src="https://avatars.githubusercontent.com/u/57706635?v=4?s=100" width="100px;" alt="AndriyPyzh"/><br /><sub><b>AndriyPyzh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AndriyPyzh" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yonatankarp"><img src="https://avatars.githubusercontent.com/u/14914865?v=4?s=100" width="100px;" alt="Yonatan Karp-Rudin"/><br /><sub><b>Yonatan Karp-Rudin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yonatankarp" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Ayonatankarp" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/karthikbhat13"><img src="https://avatars.githubusercontent.com/u/22431014?v=4?s=100" width="100px;" alt="karthikbhat13"/><br /><sub><b>karthikbhat13</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=karthikbhat13" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GustavoOliani"><img src="https://avatars.githubusercontent.com/u/25756378?v=4?s=100" width="100px;" alt="Oliani"/><br /><sub><b>Oliani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=GustavoOliani" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/mortezaadi"><img src="https://avatars.githubusercontent.com/u/1329687?v=4?s=100" width="100px;" alt="Morteza Adigozalpour"/><br /><sub><b>Morteza Adigozalpour</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mortezaadi" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Liu-rj"><img src="https://avatars.githubusercontent.com/u/64826925?v=4?s=100" width="100px;" alt="Renjie LIU"/><br /><sub><b>Renjie LIU</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Liu-rj" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TreeFireMen"><img src="https://avatars.githubusercontent.com/u/54127694?v=4?s=100" width="100px;" alt="perfect guy"/><br /><sub><b>perfect guy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=TreeFireMen" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://stackoverflow.com/users/308565/nagaraj-tantri"><img src="https://avatars.githubusercontent.com/u/3784194?v=4?s=100" width="100px;" alt="Nagaraj Tantri"/><br /><sub><b>Nagaraj Tantri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tan31989" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/xyllq999"><img src="https://avatars.githubusercontent.com/u/72729433?v=4?s=100" width="100px;" alt="xyllq999"/><br /><sub><b>xyllq999</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=xyllq999" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/frascu"><img src="https://avatars.githubusercontent.com/u/7107651?v=4?s=100" width="100px;" alt="Francesco Scuccimarri"/><br /><sub><b>Francesco Scuccimarri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=frascu" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dmdbilal"><img src="https://avatars.githubusercontent.com/u/91405690?v=4?s=100" width="100px;" alt="Mohamed Bilal"/><br /><sub><b>Mohamed Bilal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dmdbilal" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Conhan93"><img src="https://avatars.githubusercontent.com/u/71334757?v=4?s=100" width="100px;" alt="Conny Hansson"/><br /><sub><b>Conny Hansson</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Conhan93" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/karshilsheth/"><img src="https://avatars.githubusercontent.com/u/37497287?v=4?s=100" width="100px;" alt="Karshil sheth"/><br /><sub><b>Karshil sheth</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=karshil2309" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://muklasr.medium.com"><img src="https://avatars.githubusercontent.com/u/43443753?v=4?s=100" width="100px;" alt="Muklas Rahmanto"/><br /><sub><b>Muklas Rahmanto</b></sub></a><br /><a href="#translation-muklasr" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kongleong86"><img src="https://avatars.githubusercontent.com/u/3745455?v=4?s=100" width="100px;" alt="kongleong86"/><br /><sub><b>kongleong86</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kongleong86" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/VxDxK"><img src="https://avatars.githubusercontent.com/u/38704817?v=4?s=100" width="100px;" alt="Vadim"/><br /><sub><b>Vadim</b></sub></a><br /><a href="#translation-VxDxK" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aitorfi"><img src="https://avatars.githubusercontent.com/u/64830228?v=4?s=100" width="100px;" alt="Aitor Fidalgo Sánchez"/><br /><sub><b>Aitor Fidalgo Sánchez</b></sub></a><br /><a href="#translation-aitorfi" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=aitorfi" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aaitorfi" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sims-keshri"><img src="https://avatars.githubusercontent.com/u/62168475?v=4?s=100" width="100px;" alt="Simran Keshri"/><br /><sub><b>Simran Keshri</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sims-keshri" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HeVictor"><img src="https://avatars.githubusercontent.com/u/20733994?v=4?s=100" width="100px;" alt="Victor He"/><br /><sub><b>Victor He</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HeVictor" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://m-inh.github.io/"><img src="https://avatars.githubusercontent.com/u/10632233?v=4?s=100" width="100px;" alt="Minh Nguyen"/><br /><sub><b>Minh Nguyen</b></sub></a><br /><a href="#translation-m-inh" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=m-inh" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://programacionymas.com"><img src="https://avatars.githubusercontent.com/u/3101238?v=4?s=100" width="100px;" alt="JCarlos"/><br /><sub><b>JCarlos</b></sub></a><br /><a href="#translation-JCarlosR" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HeVictor"><img src="https://avatars.githubusercontent.com/u/20733994?v=4?s=100" width="100px;" alt="Victor He"/><br /><sub><b>Victor He</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HeVictor" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.mrmoshkel.ir"><img src="https://avatars.githubusercontent.com/u/60359433?v=4?s=100" width="100px;" alt="Ali Ghasemi"/><br /><sub><b>Ali Ghasemi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Dev-AliGhasemi" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/YichuanSun"><img src="https://avatars.githubusercontent.com/u/30886176?v=4?s=100" width="100px;" alt="yiichan"/><br /><sub><b>yiichan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=YichuanSun" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://carlfx.wordpress.com"><img src="https://avatars.githubusercontent.com/u/1594624?v=4?s=100" width="100px;" alt="Carl Dea"/><br /><sub><b>Carl Dea</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=carldea" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/PanSem"><img src="https://avatars.githubusercontent.com/u/43316964?v=4?s=100" width="100px;" alt="Pan Sem"/><br /><sub><b>Pan Sem</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=PanSem" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Mozartuss"><img src="https://avatars.githubusercontent.com/u/32893711?v=4?s=100" width="100px;" alt="Mozartus"/><br /><sub><b>Mozartus</b></sub></a><br /><a href="#translation-Mozartuss" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zhoumengyks"><img src="https://avatars.githubusercontent.com/u/111965739?v=4?s=100" width="100px;" alt="zhoumengyks"/><br /><sub><b>zhoumengyks</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zhoumengyks" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ManviGoel26"><img src="https://avatars.githubusercontent.com/u/55682355?v=4?s=100" width="100px;" alt="Manvi Goel"/><br /><sub><b>Manvi Goel</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ManviGoel26" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/you"><img src="https://avatars.githubusercontent.com/u/57100752?v=4?s=100" width="100px;" alt="you"/><br /><sub><b>you</b></sub></a><br /><a href="#translation-you" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/blueberry404"><img src="https://avatars.githubusercontent.com/u/39243539?v=4?s=100" width="100px;" alt="Anum Amin"/><br /><sub><b>Anum Amin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=blueberry404" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/thanks"><img src="https://avatars.githubusercontent.com/u/1121545?v=4?s=100" width="100px;" alt="Thanks"/><br /><sub><b>Thanks</b></sub></a><br /><a href="#translation-Thanks" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lazy-pr0grammer"><img src="https://avatars.githubusercontent.com/u/87204946?v=4?s=100" width="100px;" alt="LazyProgrammer"/><br /><sub><b>LazyProgrammer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=lazy-pr0grammer" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://uh-zz.github.io/blog/"><img src="https://avatars.githubusercontent.com/u/47747828?v=4?s=100" width="100px;" alt="Reo Uehara"/><br /><sub><b>Reo Uehara</b></sub></a><br /><a href="#translation-uh-zz" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mdfaizanahmed786"><img src="https://avatars.githubusercontent.com/u/85175130?v=4?s=100" width="100px;" alt="Mohammed Faizan Ahmed"/><br /><sub><b>Mohammed Faizan Ahmed</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mdfaizanahmed786" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Fiordy"><img src="https://avatars.githubusercontent.com/u/53420573?v=4?s=100" width="100px;" alt="Fiordy"/><br /><sub><b>Fiordy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Fiordy" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/burno1"><img src="https://avatars.githubusercontent.com/u/39165280?v=4?s=100" width="100px;" alt="Bruno Fernandes"/><br /><sub><b>Bruno Fernandes</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=burno1" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/harshalkh"><img src="https://avatars.githubusercontent.com/u/37841724?v=4?s=100" width="100px;" alt="Harshal"/><br /><sub><b>Harshal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=harshalkh" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SammanPali"><img src="https://avatars.githubusercontent.com/u/110753804?v=4?s=100" width="100px;" alt="SammanPali"/><br /><sub><b>SammanPali</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SammanPali" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/abhinav-vashisth-06613b208/"><img src="https://avatars.githubusercontent.com/u/89785800?v=4?s=100" width="100px;" alt="Abhinav Vashisth"/><br /><sub><b>Abhinav Vashisth</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vashisthabhinav" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/LeseChe"><img src="https://avatars.githubusercontent.com/u/79553089?v=4?s=100" width="100px;" alt="Qixiang Chen"/><br /><sub><b>Qixiang Chen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=LeseChe" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://no website"><img src="https://avatars.githubusercontent.com/u/47126749?v=4?s=100" width="100px;" alt="Kevin"/><br /><sub><b>Kevin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AKevinyl3" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Kevinyl3" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shouryamanekar"><img src="https://avatars.githubusercontent.com/u/72398499?v=4?s=100" width="100px;" alt="Shourya Manekar"/><br /><sub><b>Shourya Manekar</b></sub></a><br /><a href="#translation-shouryamanekar" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Shrirang97"><img src="https://avatars.githubusercontent.com/u/28738668?v=4?s=100" width="100px;" alt="Shrirang"/><br /><sub><b>Shrirang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AShrirang97" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=Shrirang97" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://seongkyu-lim.github.io/Blog/"><img src="https://avatars.githubusercontent.com/u/55138532?v=4?s=100" width="100px;" alt="Alan"/><br /><sub><b>Alan</b></sub></a><br /><a href="#translation-seongkyu-lim" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JanFidor"><img src="https://avatars.githubusercontent.com/u/66260538?v=4?s=100" width="100px;" alt="JanFidor"/><br /><sub><b>JanFidor</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JanFidor" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=JanFidor" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/interactwithankush"><img src="https://avatars.githubusercontent.com/u/18613127?v=4?s=100" width="100px;" alt="interactwithankush"/><br /><sub><b>interactwithankush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=interactwithankush" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/drakulavich"><img src="https://avatars.githubusercontent.com/u/129260?v=4?s=100" width="100px;" alt="Anton Yakutovich"/><br /><sub><b>Anton Yakutovich</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=drakulavich" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/yuhangbin"><img src="https://avatars.githubusercontent.com/u/17566866?v=4?s=100" width="100px;" alt="CharlieYu"/><br /><sub><b>CharlieYu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yuhangbin" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/steph88ss"><img src="https://avatars.githubusercontent.com/u/111041594?v=4?s=100" width="100px;" alt="steph88ss"/><br /><sub><b>steph88ss</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=steph88ss" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Leisterbecker"><img src="https://avatars.githubusercontent.com/u/20650323?v=4?s=100" width="100px;" alt="Leisterbecker"/><br /><sub><b>Leisterbecker</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Leisterbecker" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://yujanranjitkar.com.np"><img src="https://avatars.githubusercontent.com/u/63731234?v=4?s=100" width="100px;" alt="Yujan Ranjitkar"/><br /><sub><b>Yujan Ranjitkar</b></sub></a><br /><a href="#translation-0xYujan" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://rosaecrucis.cn"><img src="https://avatars.githubusercontent.com/u/35420129?v=4?s=100" width="100px;" alt="DragonDreamer"/><br /><sub><b>DragonDreamer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=castleKing1997" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/yusha-g"><img src="https://avatars.githubusercontent.com/u/110189579?v=4?s=100" width="100px;" alt="yusha-g"/><br /><sub><b>yusha-g</b></sub></a><br /><a href="#translation-yusha-g" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ShivanshCharak"><img src="https://avatars.githubusercontent.com/u/96943825?v=4?s=100" width="100px;" alt="ShivanshCharak"/><br /><sub><b>ShivanshCharak</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ShivanshCharak" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/robertvolkmann"><img src="https://avatars.githubusercontent.com/u/20912167?v=4?s=100" width="100px;" alt="Robert Volkmann"/><br /><sub><b>Robert Volkmann</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=robertvolkmann" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Arobertvolkmann" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/HattoriHenzo"><img src="https://avatars.githubusercontent.com/u/5141285?v=4?s=100" width="100px;" alt="HattoriHenzo"/><br /><sub><b>HattoriHenzo</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HattoriHenzo" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bipin-k"><img src="https://avatars.githubusercontent.com/u/21119358?v=4?s=100" width="100px;" alt="Bipin Kumar Chaurasia"/><br /><sub><b>Bipin Kumar Chaurasia</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bipin-k" title="Documentation">📖</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KyleSong30"><img src="https://avatars.githubusercontent.com/u/100892032?v=4?s=100" width="100px;" alt="KyleSong30"/><br /><sub><b>KyleSong30</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=KyleSong30" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://arnabsen.bio.link"><img src="https://avatars.githubusercontent.com/u/51032928?v=4?s=100" width="100px;" alt="Arnab Sen"/><br /><sub><b>Arnab Sen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=arnabsen1729" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/u7281975"><img src="https://avatars.githubusercontent.com/u/111095623?v=4?s=100" width="100px;" alt="u7281975"/><br /><sub><b>u7281975</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=u7281975" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://javaforlife.wordpress.com/"><img src="https://avatars.githubusercontent.com/u/1470114?v=4?s=100" width="100px;" alt="MohanaRao SV"/><br /><sub><b>MohanaRao SV</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mohanaraosv" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harshalkhachane"><img src="https://avatars.githubusercontent.com/u/92866584?v=4?s=100" width="100px;" alt="harshalkhachane"/><br /><sub><b>harshalkhachane</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=harshalkhachane" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/yonatankarp"><img src="https://avatars.githubusercontent.com/u/14914865?v=4?s=100" width="100px;" alt="Yonatan Karp-Rudin"/><br /><sub><b>Yonatan Karp-Rudin</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yonatankarp" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Ayonatankarp" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ec-026"><img src="https://avatars.githubusercontent.com/u/95495584?v=4?s=100" width="100px;" alt="Tejas Singh"/><br /><sub><b>Tejas Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ec-026" title="Documentation">📖</a> <a href="#translation-ec-026" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/GustavoOliani"><img src="https://avatars.githubusercontent.com/u/25756378?v=4?s=100" width="100px;" alt="Oliani"/><br /><sub><b>Oliani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=GustavoOliani" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://journal.artfuldev.com"><img src="https://avatars.githubusercontent.com/u/3091087?v=4?s=100" width="100px;" alt="Sudarsan Balaji"/><br /><sub><b>Sudarsan Balaji</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=artfuldev" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Liu-rj"><img src="https://avatars.githubusercontent.com/u/64826925?v=4?s=100" width="100px;" alt="Renjie LIU"/><br /><sub><b>Renjie LIU</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Liu-rj" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/vaibhav-agr/"><img src="https://avatars.githubusercontent.com/u/78676331?v=4?s=100" width="100px;" alt="Vaibhav Agrawal"/><br /><sub><b>Vaibhav Agrawal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vaibhav-if" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/TreeFireMen"><img src="https://avatars.githubusercontent.com/u/54127694?v=4?s=100" width="100px;" alt="perfect guy"/><br /><sub><b>perfect guy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=TreeFireMen" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/u7275858"><img src="https://avatars.githubusercontent.com/u/110969489?v=4?s=100" width="100px;" alt="u7275858"/><br /><sub><b>u7275858</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=u7275858" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://gist.github.com/prasad-333"><img src="https://avatars.githubusercontent.com/u/37048768?v=4?s=100" width="100px;" alt="prasad-333"/><br /><sub><b>prasad-333</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=prasad-333" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/xyllq999"><img src="https://avatars.githubusercontent.com/u/72729433?v=4?s=100" width="100px;" alt="xyllq999"/><br /><sub><b>xyllq999</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=xyllq999" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JurenXu"><img src="https://avatars.githubusercontent.com/u/101047547?v=4?s=100" width="100px;" alt="JurenXu"/><br /><sub><b>JurenXu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JurenXu" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dmdbilal"><img src="https://avatars.githubusercontent.com/u/91405690?v=4?s=100" width="100px;" alt="Mohamed Bilal"/><br /><sub><b>Mohamed Bilal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dmdbilal" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/murphShaw"><img src="https://avatars.githubusercontent.com/u/111167533?v=4?s=100" width="100px;" alt="murphShaw"/><br /><sub><b>murphShaw</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=murphShaw" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/karshilsheth/"><img src="https://avatars.githubusercontent.com/u/37497287?v=4?s=100" width="100px;" alt="Karshil sheth"/><br /><sub><b>Karshil sheth</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=karshil2309" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XianWu99"><img src="https://avatars.githubusercontent.com/u/111103319?v=4?s=100" width="100px;" alt="XianWu99"/><br /><sub><b>XianWu99</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=XianWu99" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/kongleong86"><img src="https://avatars.githubusercontent.com/u/3745455?v=4?s=100" width="100px;" alt="kongleong86"/><br /><sub><b>kongleong86</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=kongleong86" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JoshuaSinglaANU"><img src="https://avatars.githubusercontent.com/u/109902734?v=4?s=100" width="100px;" alt="JoshuaSinglaANU"/><br /><sub><b>JoshuaSinglaANU</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JoshuaSinglaANU" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/aitorfi"><img src="https://avatars.githubusercontent.com/u/64830228?v=4?s=100" width="100px;" alt="Aitor Fidalgo Sánchez"/><br /><sub><b>Aitor Fidalgo Sánchez</b></sub></a><br /><a href="#translation-aitorfi" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=aitorfi" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aaitorfi" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://www.linkedin.com/in/ricardo-ramos-moura"><img src="https://avatars.githubusercontent.com/u/36955909?v=4?s=100" width="100px;" alt="Ricardo Ramos"/><br /><sub><b>Ricardo Ramos</b></sub></a><br /><a href="#translation-ricardo-ramos-moura" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/HeVictor"><img src="https://avatars.githubusercontent.com/u/20733994?v=4?s=100" width="100px;" alt="Victor He"/><br /><sub><b>Victor He</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HeVictor" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://zhrfrd.github.io/faridzouheir/"><img src="https://avatars.githubusercontent.com/u/72947724?v=4?s=100" width="100px;" alt="Farid Zouheir"/><br /><sub><b>Farid Zouheir</b></sub></a><br /><a href="#translation-zhrfrd" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/vinicius-beraldo/"><img src="https://avatars.githubusercontent.com/u/91766068?v=4?s=100" width="100px;" alt="Vinícius A. B."/><br /><sub><b>Vinícius A. B.</b></sub></a><br /><a href="#translation-Viniberaldo" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://m-inh.github.io/"><img src="https://avatars.githubusercontent.com/u/10632233?v=4?s=100" width="100px;" alt="Minh Nguyen"/><br /><sub><b>Minh Nguyen</b></sub></a><br /><a href="#translation-m-inh" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=m-inh" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://www.linkedin.com/in/stefanel-stan/"><img src="https://avatars.githubusercontent.com/u/25990078?v=4?s=100" width="100px;" alt="Stefanel Stan"/><br /><sub><b>Stefanel Stan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=StefanelStan" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/HeVictor"><img src="https://avatars.githubusercontent.com/u/20733994?v=4?s=100" width="100px;" alt="Victor He"/><br /><sub><b>Victor He</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HeVictor" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bhati00"><img src="https://avatars.githubusercontent.com/u/79313705?v=4?s=100" width="100px;" alt="Prince bhati"/><br /><sub><b>Prince bhati</b></sub></a><br /><a href="#translation-bhati00" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/YichuanSun"><img src="https://avatars.githubusercontent.com/u/30886176?v=4?s=100" width="100px;" alt="yiichan"/><br /><sub><b>yiichan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=YichuanSun" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/wulangcode"><img src="https://avatars.githubusercontent.com/u/48200100?v=4?s=100" width="100px;" alt="WuLang"/><br /><sub><b>WuLang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=wulangcode" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/PanSem"><img src="https://avatars.githubusercontent.com/u/43316964?v=4?s=100" width="100px;" alt="Pan Sem"/><br /><sub><b>Pan Sem</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=PanSem" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hkattt"><img src="https://avatars.githubusercontent.com/u/54300585?v=4?s=100" width="100px;" alt="Hugo Kat"/><br /><sub><b>Hugo Kat</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hkattt" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/zhoumengyks"><img src="https://avatars.githubusercontent.com/u/111965739?v=4?s=100" width="100px;" alt="zhoumengyks"/><br /><sub><b>zhoumengyks</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=zhoumengyks" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shivu2002a"><img src="https://avatars.githubusercontent.com/u/88313126?v=4?s=100" width="100px;" alt="Shivanagouda Agasimani"/><br /><sub><b>Shivanagouda Agasimani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=shivu2002a" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/you"><img src="https://avatars.githubusercontent.com/u/57100752?v=4?s=100" width="100px;" alt="you"/><br /><sub><b>you</b></sub></a><br /><a href="#translation-you" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ap284"><img src="https://avatars.githubusercontent.com/u/13827254?v=4?s=100" width="100px;" alt="Aparna"/><br /><sub><b>Aparna</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Ap284" title="Code">💻</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/girolamo-giordano"><img src="https://avatars.githubusercontent.com/u/56109364?v=4?s=100" width="100px;" alt="Girolamo Giordano"/><br /><sub><b>Girolamo Giordano</b></sub></a><br /><a href="#translation-girolamo-giordano" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/thanks"><img src="https://avatars.githubusercontent.com/u/1121545?v=4?s=100" width="100px;" alt="Thanks"/><br /><sub><b>Thanks</b></sub></a><br /><a href="#translation-Thanks" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Chak-C"><img src="https://avatars.githubusercontent.com/u/114961815?v=4?s=100" width="100px;" alt="Chak-C"/><br /><sub><b>Chak-C</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Chak-C" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/lazy-pr0grammer"><img src="https://avatars.githubusercontent.com/u/87204946?v=4?s=100" width="100px;" alt="LazyProgrammer"/><br /><sub><b>LazyProgrammer</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=lazy-pr0grammer" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nakul251197"><img src="https://avatars.githubusercontent.com/u/39953357?v=4?s=100" width="100px;" alt="Nakul Nambiar"/><br /><sub><b>Nakul Nambiar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nakul251197" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/mdfaizanahmed786"><img src="https://avatars.githubusercontent.com/u/85175130?v=4?s=100" width="100px;" alt="Mohammed Faizan Ahmed"/><br /><sub><b>Mohammed Faizan Ahmed</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mdfaizanahmed786" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KarmaTashiCat"><img src="https://avatars.githubusercontent.com/u/76797146?v=4?s=100" width="100px;" alt="KarmaTashiCat"/><br /><sub><b>KarmaTashiCat</b></sub></a><br /><a href="#translation-KarmaTashiCat" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/burno1"><img src="https://avatars.githubusercontent.com/u/39165280?v=4?s=100" width="100px;" alt="Bruno Fernandes"/><br /><sub><b>Bruno Fernandes</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=burno1" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Marikattt"><img src="https://avatars.githubusercontent.com/u/49302558?v=4?s=100" width="100px;" alt="marikattt"/><br /><sub><b>marikattt</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Marikattt" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/SammanPali"><img src="https://avatars.githubusercontent.com/u/110753804?v=4?s=100" width="100px;" alt="SammanPali"/><br /><sub><b>SammanPali</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SammanPali" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Harsh4902"><img src="https://avatars.githubusercontent.com/u/84663071?v=4?s=100" width="100px;" alt="Hashvardhan Parmar"/><br /><sub><b>Hashvardhan Parmar</b></sub></a><br /><a href="#translation-Harsh4902" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/LeseChe"><img src="https://avatars.githubusercontent.com/u/79553089?v=4?s=100" width="100px;" alt="Qixiang Chen"/><br /><sub><b>Qixiang Chen</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=LeseChe" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://hwan33.tistory.com/"><img src="https://avatars.githubusercontent.com/u/67625677?v=4?s=100" width="100px;" alt="YongHwan"/><br /><sub><b>YongHwan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yongyongkr" title="Documentation">📖</a> <a href="#translation-yongyongkr" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shogohida"><img src="https://avatars.githubusercontent.com/u/10365357?v=4?s=100" width="100px;" alt="Shogo Hida"/><br /><sub><b>Shogo Hida</b></sub></a><br /><a href="#translation-shogohida" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/shouryamanekar"><img src="https://avatars.githubusercontent.com/u/72398499?v=4?s=100" width="100px;" alt="Shourya Manekar"/><br /><sub><b>Shourya Manekar</b></sub></a><br /><a href="#translation-shouryamanekar" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Regyl"><img src="https://avatars.githubusercontent.com/u/48804404?v=4?s=100" width="100px;" alt="Eugene"/><br /><sub><b>Eugene</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Regyl" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://seongkyu-lim.github.io/Blog/"><img src="https://avatars.githubusercontent.com/u/55138532?v=4?s=100" width="100px;" alt="Alan"/><br /><sub><b>Alan</b></sub></a><br /><a href="#translation-seongkyu-lim" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/piyush280599"><img src="https://avatars.githubusercontent.com/u/118425491?v=4?s=100" width="100px;" alt="Piyush"/><br /><sub><b>Piyush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=piyush280599" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JanFidor"><img src="https://avatars.githubusercontent.com/u/66260538?v=4?s=100" width="100px;" alt="JanFidor"/><br /><sub><b>JanFidor</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JanFidor" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=JanFidor" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/rahulraj90/"><img src="https://avatars.githubusercontent.com/u/517415?v=4?s=100" width="100px;" alt="Rahul Raj"/><br /><sub><b>Rahul Raj</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=rahul-raj" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/drakulavich"><img src="https://avatars.githubusercontent.com/u/129260?v=4?s=100" width="100px;" alt="Anton Yakutovich"/><br /><sub><b>Anton Yakutovich</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=drakulavich" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/bharathkalyans/"><img src="https://avatars.githubusercontent.com/u/49526472?v=4?s=100" width="100px;" alt="Bharath Kalyan S"/><br /><sub><b>Bharath Kalyan S</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bharathkalyans" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/steph88ss"><img src="https://avatars.githubusercontent.com/u/111041594?v=4?s=100" width="100px;" alt="steph88ss"/><br /><sub><b>steph88ss</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=steph88ss" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/thisissaiteja/"><img src="https://avatars.githubusercontent.com/u/13088886?v=4?s=100" width="100px;" alt="Saiteja Reddy"/><br /><sub><b>Saiteja Reddy</b></sub></a><br /><a href="#translation-saiteja55" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://yujanranjitkar.com.np"><img src="https://avatars.githubusercontent.com/u/63731234?v=4?s=100" width="100px;" alt="Yujan Ranjitkar"/><br /><sub><b>Yujan Ranjitkar</b></sub></a><br /><a href="#translation-0xYujan" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://twitch.tv/clerici"><img src="https://avatars.githubusercontent.com/u/115318468?v=4?s=100" width="100px;" alt="Enrique Clerici"/><br /><sub><b>Enrique Clerici</b></sub></a><br /><a href="#translation-TheClerici" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ramilS"><img src="https://avatars.githubusercontent.com/u/13589365?v=4?s=100" width="100px;" alt="Ramil Sayetov"/><br /><sub><b>Ramil Sayetov</b></sub></a><br /><a href="#translation-ramilS" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/yusha-g"><img src="https://avatars.githubusercontent.com/u/110189579?v=4?s=100" width="100px;" alt="yusha-g"/><br /><sub><b>yusha-g</b></sub></a><br /><a href="#translation-yusha-g" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://pkq.xyz"><img src="https://avatars.githubusercontent.com/u/50656114?v=4?s=100" width="100px;" alt="东方未白"/><br /><sub><b>东方未白</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pikapiu" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/robertvolkmann"><img src="https://avatars.githubusercontent.com/u/20912167?v=4?s=100" width="100px;" alt="Robert Volkmann"/><br /><sub><b>Robert Volkmann</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=robertvolkmann" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Arobertvolkmann" title="Reviewed Pull Requests">👀</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/swashb0ckler"><img src="https://avatars.githubusercontent.com/u/62488841?v=4?s=100" width="100px;" alt="Fredrik Sejr"/><br /><sub><b>Fredrik Sejr</b></sub></a><br /><a href="#translation-swashb0ckler" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/bipin-k"><img src="https://avatars.githubusercontent.com/u/21119358?v=4?s=100" width="100px;" alt="Bipin Kumar Chaurasia"/><br /><sub><b>Bipin Kumar Chaurasia</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bipin-k" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/akshatarora0013"><img src="https://avatars.githubusercontent.com/u/102645021?v=4?s=100" width="100px;" alt="akshatarora0013"/><br /><sub><b>akshatarora0013</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=akshatarora0013" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/KyleSong30"><img src="https://avatars.githubusercontent.com/u/100892032?v=4?s=100" width="100px;" alt="KyleSong30"/><br /><sub><b>KyleSong30</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=KyleSong30" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://mugheesqasimmq.wixsite.com/portfolio-website"><img src="https://avatars.githubusercontent.com/u/45170085?v=4?s=100" width="100px;" alt="Mughees Qasim"/><br /><sub><b>Mughees Qasim</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MugheesQasim" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/u7281975"><img src="https://avatars.githubusercontent.com/u/111095623?v=4?s=100" width="100px;" alt="u7281975"/><br /><sub><b>u7281975</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=u7281975" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/behappyleee"><img src="https://avatars.githubusercontent.com/u/72903623?v=4?s=100" width="100px;" alt="behappyleee"/><br /><sub><b>behappyleee</b></sub></a><br /><a href="#translation-behappyleee" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/harshalkhachane"><img src="https://avatars.githubusercontent.com/u/92866584?v=4?s=100" width="100px;" alt="harshalkhachane"/><br /><sub><b>harshalkhachane</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=harshalkhachane" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ayush-Thakur-geek"><img src="https://avatars.githubusercontent.com/u/116510022?v=4?s=100" width="100px;" alt="Ayush Thakur"/><br /><sub><b>Ayush Thakur</b></sub></a><br /><a href="#translation-Ayush-Thakur-geek" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/boscha1"><img src="https://avatars.githubusercontent.com/u/55814237?v=4?s=100" width="100px;" alt="Anthony Bosch"/><br /><sub><b>Anthony Bosch</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=boscha1" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ec-026"><img src="https://avatars.githubusercontent.com/u/95495584?v=4?s=100" width="100px;" alt="Tejas Singh"/><br /><sub><b>Tejas Singh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ec-026" title="Documentation">📖</a> <a href="#translation-ec-026" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AnsonTran"><img src="https://avatars.githubusercontent.com/u/37683428?v=4?s=100" width="100px;" alt="trananso"/><br /><sub><b>trananso</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AnsonTran" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://journal.artfuldev.com"><img src="https://avatars.githubusercontent.com/u/3091087?v=4?s=100" width="100px;" alt="Sudarsan Balaji"/><br /><sub><b>Sudarsan Balaji</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=artfuldev" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/beef-e"><img src="https://avatars.githubusercontent.com/u/102854627?v=4?s=100" width="100px;" alt="Giammaria Biffi"/><br /><sub><b>Giammaria Biffi</b></sub></a><br /><a href="#translation-beef-e" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/vaibhav-agr/"><img src="https://avatars.githubusercontent.com/u/78676331?v=4?s=100" width="100px;" alt="Vaibhav Agrawal"/><br /><sub><b>Vaibhav Agrawal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=vaibhav-if" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/saif7159"><img src="https://avatars.githubusercontent.com/u/36008396?v=4?s=100" width="100px;" alt="Saiful Haque"/><br /><sub><b>Saiful Haque</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=saif7159" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/u7275858"><img src="https://avatars.githubusercontent.com/u/110969489?v=4?s=100" width="100px;" alt="u7275858"/><br /><sub><b>u7275858</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=u7275858" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JabezBrew"><img src="https://avatars.githubusercontent.com/u/74483609?v=4?s=100" width="100px;" alt="JabezBrew"/><br /><sub><b>JabezBrew</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JabezBrew" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://gist.github.com/prasad-333"><img src="https://avatars.githubusercontent.com/u/37048768?v=4?s=100" width="100px;" alt="prasad-333"/><br /><sub><b>prasad-333</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=prasad-333" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/konstantin-goldman"><img src="https://avatars.githubusercontent.com/u/47669472?v=4?s=100" width="100px;" alt="konstantin-goldman"/><br /><sub><b>konstantin-goldman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=konstantin-goldman" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JurenXu"><img src="https://avatars.githubusercontent.com/u/101047547?v=4?s=100" width="100px;" alt="JurenXu"/><br /><sub><b>JurenXu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JurenXu" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://miti99.dev"><img src="https://avatars.githubusercontent.com/u/39063457?v=4?s=100" width="100px;" alt="Tien Nguyen Minh"/><br /><sub><b>Tien Nguyen Minh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tiennm99" title="Code">💻</a> <a href="#translation-tiennm99" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VladimirCreator"><img src="https://avatars.githubusercontent.com/u/49140851?v=4?s=100" width="100px;" alt="Vladimir"/><br /><sub><b>Vladimir</b></sub></a><br /><a href="#translation-VladimirCreator" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/murphShaw"><img src="https://avatars.githubusercontent.com/u/111167533?v=4?s=100" width="100px;" alt="murphShaw"/><br /><sub><b>murphShaw</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=murphShaw" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://surjendu-pal.netlify.app/"><img src="https://avatars.githubusercontent.com/u/101238933?v=4?s=100" width="100px;" alt="Surjendu"/><br /><sub><b>Surjendu</b></sub></a><br /><a href="#translation-surjendu104" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/XianWu99"><img src="https://avatars.githubusercontent.com/u/111103319?v=4?s=100" width="100px;" alt="XianWu99"/><br /><sub><b>XianWu99</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=XianWu99" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bakazhou"><img src="https://avatars.githubusercontent.com/u/81795984?v=4?s=100" width="100px;" alt="bakazhou"/><br /><sub><b>bakazhou</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bakazhou" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JoshuaSinglaANU"><img src="https://avatars.githubusercontent.com/u/109902734?v=4?s=100" width="100px;" alt="JoshuaSinglaANU"/><br /><sub><b>JoshuaSinglaANU</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JoshuaSinglaANU" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Owen-CH-Leung"><img src="https://avatars.githubusercontent.com/u/43698890?v=4?s=100" width="100px;" alt="Owen Leung"/><br /><sub><b>Owen Leung</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Owen-CH-Leung" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://www.linkedin.com/in/ricardo-ramos-moura"><img src="https://avatars.githubusercontent.com/u/36955909?v=4?s=100" width="100px;" alt="Ricardo Ramos"/><br /><sub><b>Ricardo Ramos</b></sub></a><br /><a href="#translation-ricardo-ramos-moura" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/thestbar"><img src="https://avatars.githubusercontent.com/u/20283468?v=4?s=100" width="100px;" alt="Stavros Barousis"/><br /><sub><b>Stavros Barousis</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=thestbar" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://zhrfrd.github.io/faridzouheir/"><img src="https://avatars.githubusercontent.com/u/72947724?v=4?s=100" width="100px;" alt="Farid Zouheir"/><br /><sub><b>Farid Zouheir</b></sub></a><br /><a href="#translation-zhrfrd" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ibrahim89"><img src="https://avatars.githubusercontent.com/u/20753671?v=4?s=100" width="100px;" alt="Syyed Ibrahim Abdullah"/><br /><sub><b>Syyed Ibrahim Abdullah</b></sub></a><br /><a href="#translation-ibrahim89" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/vinicius-beraldo/"><img src="https://avatars.githubusercontent.com/u/91766068?v=4?s=100" width="100px;" alt="Vinícius A. B."/><br /><sub><b>Vinícius A. B.</b></sub></a><br /><a href="#translation-Viniberaldo" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JanisZhang"><img src="https://avatars.githubusercontent.com/u/95570096?v=4?s=100" width="100px;" alt="JiaDi Zhang"/><br /><sub><b>JiaDi Zhang</b></sub></a><br /><a href="#translation-JanisZhang" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sanchitbansal10"><img src="https://avatars.githubusercontent.com/u/16536741?v=4?s=100" width="100px;" alt="Sanchit Bansal"/><br /><sub><b>Sanchit Bansal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sanchitbansal10" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://www.linkedin.com/in/stefanel-stan/"><img src="https://avatars.githubusercontent.com/u/25990078?v=4?s=100" width="100px;" alt="Stefanel Stan"/><br /><sub><b>Stefanel Stan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=StefanelStan" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mm-saiful6854"><img src="https://avatars.githubusercontent.com/u/48361160?v=4?s=100" width="100px;" alt="Md Saiful Islam"/><br /><sub><b>Md Saiful Islam</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mm-saiful6854" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/bhati00"><img src="https://avatars.githubusercontent.com/u/79313705?v=4?s=100" width="100px;" alt="Prince bhati"/><br /><sub><b>Prince bhati</b></sub></a><br /><a href="#translation-bhati00" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AddeusExMachina"><img src="https://avatars.githubusercontent.com/u/39912670?v=4?s=100" width="100px;" alt="Antonio Addeo"/><br /><sub><b>Antonio Addeo</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AddeusExMachina" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=AddeusExMachina" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/wulangcode"><img src="https://avatars.githubusercontent.com/u/48200100?v=4?s=100" width="100px;" alt="WuLang"/><br /><sub><b>WuLang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=wulangcode" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Upendra-Allagadda"><img src="https://avatars.githubusercontent.com/u/25962010?v=4?s=100" width="100px;" alt="Allagadda Sai Upendranath"/><br /><sub><b>Allagadda Sai Upendranath</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Upendra-Allagadda" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hkattt"><img src="https://avatars.githubusercontent.com/u/54300585?v=4?s=100" width="100px;" alt="Hugo Kat"/><br /><sub><b>Hugo Kat</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hkattt" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/mobraga/"><img src="https://avatars.githubusercontent.com/u/31048764?v=4?s=100" width="100px;" alt="Matheus Braga"/><br /><sub><b>Matheus Braga</b></sub></a><br /><a href="#translation-mathbraga" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=mathbraga" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/shivu2002a"><img src="https://avatars.githubusercontent.com/u/88313126?v=4?s=100" width="100px;" alt="Shivanagouda Agasimani"/><br /><sub><b>Shivanagouda Agasimani</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=shivu2002a" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/satyabarghav"><img src="https://avatars.githubusercontent.com/u/36763910?v=4?s=100" width="100px;" alt="Appari Satya Barghav"/><br /><sub><b>Appari Satya Barghav</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=satyabarghav" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Ap284"><img src="https://avatars.githubusercontent.com/u/13827254?v=4?s=100" width="100px;" alt="Aparna"/><br /><sub><b>Aparna</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Ap284" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://mribeirodantas.me"><img src="https://avatars.githubusercontent.com/u/1023197?v=4?s=100" width="100px;" alt="Marcel Ribeiro-Dantas"/><br /><sub><b>Marcel Ribeiro-Dantas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mribeirodantas" title="Documentation">📖</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hamexhanif"><img src="https://avatars.githubusercontent.com/u/74542852?v=4?s=100" width="100px;" alt="Muhammad Hanif Amrullah"/><br /><sub><b>Muhammad Hanif Amrullah</b></sub></a><br /><a href="#translation-hamexhanif" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/girolamo-giordano"><img src="https://avatars.githubusercontent.com/u/56109364?v=4?s=100" width="100px;" alt="Girolamo Giordano"/><br /><sub><b>Girolamo Giordano</b></sub></a><br /><a href="#translation-girolamo-giordano" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JackH408"><img src="https://avatars.githubusercontent.com/u/141727294?v=4?s=100" width="100px;" alt="JackH408"/><br /><sub><b>JackH408</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JackH408" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Chak-C"><img src="https://avatars.githubusercontent.com/u/114961815?v=4?s=100" width="100px;" alt="Chak-C"/><br /><sub><b>Chak-C</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Chak-C" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/versus2004"><img src="https://avatars.githubusercontent.com/u/132815243?v=4?s=100" width="100px;" alt="Shubham"/><br /><sub><b>Shubham</b></sub></a><br /><a href="#translation-versus2004" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/nakul251197"><img src="https://avatars.githubusercontent.com/u/39953357?v=4?s=100" width="100px;" alt="Nakul Nambiar"/><br /><sub><b>Nakul Nambiar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nakul251197" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/inishantjain"><img src="https://avatars.githubusercontent.com/u/121454072?v=4?s=100" width="100px;" alt="Nishant Jain"/><br /><sub><b>Nishant Jain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=inishantjain" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/KarmaTashiCat"><img src="https://avatars.githubusercontent.com/u/76797146?v=4?s=100" width="100px;" alt="KarmaTashiCat"/><br /><sub><b>KarmaTashiCat</b></sub></a><br /><a href="#translation-KarmaTashiCat" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hallowshaw"><img src="https://avatars.githubusercontent.com/u/90751158?v=4?s=100" width="100px;" alt="Rhitam Chaudhury"/><br /><sub><b>Rhitam Chaudhury</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hallowshaw" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Marikattt"><img src="https://avatars.githubusercontent.com/u/49302558?v=4?s=100" width="100px;" alt="marikattt"/><br /><sub><b>marikattt</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Marikattt" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JerryZhao275"><img src="https://avatars.githubusercontent.com/u/132061401?v=4?s=100" width="100px;" alt="JerryZhao275"/><br /><sub><b>JerryZhao275</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JerryZhao275" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Harsh4902"><img src="https://avatars.githubusercontent.com/u/84663071?v=4?s=100" width="100px;" alt="Hashvardhan Parmar"/><br /><sub><b>Hashvardhan Parmar</b></sub></a><br /><a href="#translation-Harsh4902" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://twitter.com/llisant"><img src="https://avatars.githubusercontent.com/u/1445890?v=4?s=100" width="100px;" alt="Leonardo Lisanti"/><br /><sub><b>Leonardo Lisanti</b></sub></a><br /><a href="#translation-leonardol" title="Translation">🌍</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="http://www.linkedin.com/in/yenniferh"><img src="https://avatars.githubusercontent.com/u/19285706?v=4?s=100" width="100px;" alt="Yennifer Herrera"/><br /><sub><b>Yennifer Herrera</b></sub></a><br /><a href="#translation-Yenniferh" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AYenniferh" title="Reviewed Pull Requests">👀</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://hwan33.tistory.com/"><img src="https://avatars.githubusercontent.com/u/67625677?v=4?s=100" width="100px;" alt="YongHwan"/><br /><sub><b>YongHwan</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yongyongkr" title="Documentation">📖</a> <a href="#translation-yongyongkr" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jnniu-n"><img src="https://avatars.githubusercontent.com/u/141746282?v=4?s=100" width="100px;" alt="jnniu-n"/><br /><sub><b>jnniu-n</b></sub></a><br /><a href="#translation-jnniu-n" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/shogohida"><img src="https://avatars.githubusercontent.com/u/10365357?v=4?s=100" width="100px;" alt="Shogo Hida"/><br /><sub><b>Shogo Hida</b></sub></a><br /><a href="#translation-shogohida" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/miguel-is-coding"><img src="https://avatars.githubusercontent.com/u/48435117?v=4?s=100" width="100px;" alt="Miguel Angel Perez Garcia"/><br /><sub><b>Miguel Angel Perez Garcia</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Amiguel-is-coding" title="Reviewed Pull Requests">👀</a> <a href="#translation-miguel-is-coding" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Regyl"><img src="https://avatars.githubusercontent.com/u/48804404?v=4?s=100" width="100px;" alt="Eugene"/><br /><sub><b>Eugene</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Regyl" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SuwanSankaja"><img src="https://avatars.githubusercontent.com/u/86839778?v=4?s=100" width="100px;" alt="Suwan Sankaja"/><br /><sub><b>Suwan Sankaja</b></sub></a><br /><a href="#translation-SuwanSankaja" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/piyush280599"><img src="https://avatars.githubusercontent.com/u/118425491?v=4?s=100" width="100px;" alt="Piyush"/><br /><sub><b>Piyush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=piyush280599" title="Documentation">📖</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Iamalok007"><img src="https://avatars.githubusercontent.com/u/97467835?v=4?s=100" width="100px;" alt="alok"/><br /><sub><b>alok</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Iamalok007" title="Documentation">📖</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/rahulraj90/"><img src="https://avatars.githubusercontent.com/u/517415?v=4?s=100" width="100px;" alt="Rahul Raj"/><br /><sub><b>Rahul Raj</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=rahul-raj" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dlvideira"><img src="https://avatars.githubusercontent.com/u/53951425?v=4?s=100" width="100px;" alt="Daniel Lisboa"/><br /><sub><b>Daniel Lisboa</b></sub></a><br /><a href="#translation-dlvideira" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/bharathkalyans/"><img src="https://avatars.githubusercontent.com/u/49526472?v=4?s=100" width="100px;" alt="Bharath Kalyan S"/><br /><sub><b>Bharath Kalyan S</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bharathkalyans" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ComplexOW"><img src="https://avatars.githubusercontent.com/u/105279107?v=4?s=100" width="100px;" alt="Sam Powell"/><br /><sub><b>Sam Powell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ComplexOW" title="Documentation">📖</a></td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jppf22"><img src="https://avatars.githubusercontent.com/u/104360594?v=4?s=100" width="100px;" alt="João Fernandes"/><br /><sub><b>João Fernandes</b></sub></a><br /><a href="#translation-jppf22" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/thisissaiteja/"><img src="https://avatars.githubusercontent.com/u/13088886?v=4?s=100" width="100px;" alt="Saiteja Reddy"/><br /><sub><b>Saiteja Reddy</b></sub></a><br /><a href="#translation-saiteja55" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/HongGeonUi"><img src="https://avatars.githubusercontent.com/u/89684956?v=4?s=100" width="100px;" alt="Hong Geon-ui"/><br /><sub><b>Hong Geon-ui</b></sub></a><br /><a href="#translation-HongGeonUi" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="http://twitch.tv/clerici"><img src="https://avatars.githubusercontent.com/u/115318468?v=4?s=100" width="100px;" alt="Enrique Clerici"/><br /><sub><b>Enrique Clerici</b></sub></a><br /><a href="#translation-TheClerici" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ylcn91"><img src="https://avatars.githubusercontent.com/u/7249450?v=4?s=100" width="100px;" alt="Doksanbir"/><br /><sub><b>Doksanbir</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ylcn91" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ramilS"><img src="https://avatars.githubusercontent.com/u/13589365?v=4?s=100" width="100px;" alt="Ramil Sayetov"/><br /><sub><b>Ramil Sayetov</b></sub></a><br /><a href="#translation-ramilS" title="Translation">🌍</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Chant3ll3"><img src="https://avatars.githubusercontent.com/u/141697333?v=4?s=100" width="100px;" alt="Chant3ll3"/><br /><sub><b>Chant3ll3</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Chant3ll3" title="Documentation">📖</a> <a href="#translation-Chant3ll3" title="Translation">🌍</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://pkq.xyz"><img src="https://avatars.githubusercontent.com/u/50656114?v=4?s=100" width="100px;" alt="东方未白"/><br /><sub><b>东方未白</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pikapiu" title="Code">💻</a></td>
|
||||||
<td align="center" valign="top" width="14.28%"><a href="https://hwan33.tistory.com/"><img src="https://avatars.githubusercontent.com/u/67625677?v=4?s=100" width="100px;" alt="YongHwan Kwon"/><br /><sub><b>YongHwan Kwon</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hwan33" title="Code">💻</a></td>
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/swashb0ckler"><img src="https://avatars.githubusercontent.com/u/62488841?v=4?s=100" width="100px;" alt="Fredrik Sejr"/><br /><sub><b>Fredrik Sejr</b></sub></a><br /><a href="#translation-swashb0ckler" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/akshatarora0013"><img src="https://avatars.githubusercontent.com/u/102645021?v=4?s=100" width="100px;" alt="akshatarora0013"/><br /><sub><b>akshatarora0013</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=akshatarora0013" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://mugheesqasimmq.wixsite.com/portfolio-website"><img src="https://avatars.githubusercontent.com/u/45170085?v=4?s=100" width="100px;" alt="Mughees Qasim"/><br /><sub><b>Mughees Qasim</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MugheesQasim" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/behappyleee"><img src="https://avatars.githubusercontent.com/u/72903623?v=4?s=100" width="100px;" alt="behappyleee"/><br /><sub><b>behappyleee</b></sub></a><br /><a href="#translation-behappyleee" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Ayush-Thakur-geek"><img src="https://avatars.githubusercontent.com/u/116510022?v=4?s=100" width="100px;" alt="Ayush Thakur"/><br /><sub><b>Ayush Thakur</b></sub></a><br /><a href="#translation-Ayush-Thakur-geek" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/boscha1"><img src="https://avatars.githubusercontent.com/u/55814237?v=4?s=100" width="100px;" alt="Anthony Bosch"/><br /><sub><b>Anthony Bosch</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=boscha1" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/AnsonTran"><img src="https://avatars.githubusercontent.com/u/37683428?v=4?s=100" width="100px;" alt="trananso"/><br /><sub><b>trananso</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AnsonTran" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/beef-e"><img src="https://avatars.githubusercontent.com/u/102854627?v=4?s=100" width="100px;" alt="Giammaria Biffi"/><br /><sub><b>Giammaria Biffi</b></sub></a><br /><a href="#translation-beef-e" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/saif7159"><img src="https://avatars.githubusercontent.com/u/36008396?v=4?s=100" width="100px;" alt="Saiful Haque"/><br /><sub><b>Saiful Haque</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=saif7159" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JabezBrew"><img src="https://avatars.githubusercontent.com/u/74483609?v=4?s=100" width="100px;" alt="JabezBrew"/><br /><sub><b>JabezBrew</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JabezBrew" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/konstantin-goldman"><img src="https://avatars.githubusercontent.com/u/47669472?v=4?s=100" width="100px;" alt="konstantin-goldman"/><br /><sub><b>konstantin-goldman</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=konstantin-goldman" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/tiennm99"><img src="https://avatars.githubusercontent.com/u/39063457?v=4?s=100" width="100px;" alt="Tien Nguyen Minh"/><br /><sub><b>Tien Nguyen Minh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=tiennm99" title="Code">💻</a> <a href="#translation-tiennm99" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/VladimirCreator"><img src="https://avatars.githubusercontent.com/u/49140851?v=4?s=100" width="100px;" alt="Vladimir"/><br /><sub><b>Vladimir</b></sub></a><br /><a href="#translation-VladimirCreator" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://surjendu-pal.netlify.app/"><img src="https://avatars.githubusercontent.com/u/101238933?v=4?s=100" width="100px;" alt="Surjendu"/><br /><sub><b>Surjendu</b></sub></a><br /><a href="#translation-surjendu104" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=surjendu104" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/bakazhou"><img src="https://avatars.githubusercontent.com/u/81795984?v=4?s=100" width="100px;" alt="bakazhou"/><br /><sub><b>bakazhou</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=bakazhou" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Owen-CH-Leung"><img src="https://avatars.githubusercontent.com/u/43698890?v=4?s=100" width="100px;" alt="Owen Leung"/><br /><sub><b>Owen Leung</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Owen-CH-Leung" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/thestbar"><img src="https://avatars.githubusercontent.com/u/20283468?v=4?s=100" width="100px;" alt="Stavros Barousis"/><br /><sub><b>Stavros Barousis</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=thestbar" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ibrahim89"><img src="https://avatars.githubusercontent.com/u/20753671?v=4?s=100" width="100px;" alt="Syyed Ibrahim Abdullah"/><br /><sub><b>Syyed Ibrahim Abdullah</b></sub></a><br /><a href="#translation-ibrahim89" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JanisZhang"><img src="https://avatars.githubusercontent.com/u/95570096?v=4?s=100" width="100px;" alt="JiaDi Zhang"/><br /><sub><b>JiaDi Zhang</b></sub></a><br /><a href="#translation-JanisZhang" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sanchitbansal10"><img src="https://avatars.githubusercontent.com/u/16536741?v=4?s=100" width="100px;" alt="Sanchit Bansal"/><br /><sub><b>Sanchit Bansal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sanchitbansal10" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/mm-saiful6854"><img src="https://avatars.githubusercontent.com/u/48361160?v=4?s=100" width="100px;" alt="Md Saiful Islam"/><br /><sub><b>Md Saiful Islam</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mm-saiful6854" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/AddeusExMachina"><img src="https://avatars.githubusercontent.com/u/39912670?v=4?s=100" width="100px;" alt="Antonio Addeo"/><br /><sub><b>Antonio Addeo</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AddeusExMachina" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=AddeusExMachina" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Upendra-Allagadda"><img src="https://avatars.githubusercontent.com/u/25962010?v=4?s=100" width="100px;" alt="Allagadda Sai Upendranath"/><br /><sub><b>Allagadda Sai Upendranath</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Upendra-Allagadda" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://www.linkedin.com/in/mobraga/"><img src="https://avatars.githubusercontent.com/u/31048764?v=4?s=100" width="100px;" alt="Matheus Braga"/><br /><sub><b>Matheus Braga</b></sub></a><br /><a href="#translation-mathbraga" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=mathbraga" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/satyabarghav"><img src="https://avatars.githubusercontent.com/u/36763910?v=4?s=100" width="100px;" alt="Appari Satya Barghav"/><br /><sub><b>Appari Satya Barghav</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=satyabarghav" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="http://mribeirodantas.me"><img src="https://avatars.githubusercontent.com/u/1023197?v=4?s=100" width="100px;" alt="Marcel Ribeiro-Dantas"/><br /><sub><b>Marcel Ribeiro-Dantas</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mribeirodantas" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hamexhanif"><img src="https://avatars.githubusercontent.com/u/74542852?v=4?s=100" width="100px;" alt="Muhammad Hanif Amrullah"/><br /><sub><b>Muhammad Hanif Amrullah</b></sub></a><br /><a href="#translation-hamexhanif" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JackH408"><img src="https://avatars.githubusercontent.com/u/141727294?v=4?s=100" width="100px;" alt="JackH408"/><br /><sub><b>JackH408</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JackH408" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/versus2004"><img src="https://avatars.githubusercontent.com/u/132815243?v=4?s=100" width="100px;" alt="Shubham"/><br /><sub><b>Shubham</b></sub></a><br /><a href="#translation-versus2004" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/inishantjain"><img src="https://avatars.githubusercontent.com/u/121454072?v=4?s=100" width="100px;" alt="Nishant Jain"/><br /><sub><b>Nishant Jain</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=inishantjain" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hallowshaw"><img src="https://avatars.githubusercontent.com/u/90751158?v=4?s=100" width="100px;" alt="Rhitam Chaudhury"/><br /><sub><b>Rhitam Chaudhury</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hallowshaw" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/JerryZhao275"><img src="https://avatars.githubusercontent.com/u/132061401?v=4?s=100" width="100px;" alt="JerryZhao275"/><br /><sub><b>JerryZhao275</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=JerryZhao275" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://twitter.com/llisant"><img src="https://avatars.githubusercontent.com/u/1445890?v=4?s=100" width="100px;" alt="Leonardo Lisanti"/><br /><sub><b>Leonardo Lisanti</b></sub></a><br /><a href="#translation-leonardol" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="http://www.linkedin.com/in/yenniferh"><img src="https://avatars.githubusercontent.com/u/19285706?v=4?s=100" width="100px;" alt="Yennifer Herrera"/><br /><sub><b>Yennifer Herrera</b></sub></a><br /><a href="#translation-Yenniferh" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3AYenniferh" title="Reviewed Pull Requests">👀</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jnniu-n"><img src="https://avatars.githubusercontent.com/u/141746282?v=4?s=100" width="100px;" alt="jnniu-n"/><br /><sub><b>jnniu-n</b></sub></a><br /><a href="#translation-jnniu-n" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=jnniu-n" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/miguel-is-coding"><img src="https://avatars.githubusercontent.com/u/48435117?v=4?s=100" width="100px;" alt="Miguel Angel Perez Garcia"/><br /><sub><b>Miguel Angel Perez Garcia</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Amiguel-is-coding" title="Reviewed Pull Requests">👀</a> <a href="#translation-miguel-is-coding" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/SuwanSankaja"><img src="https://avatars.githubusercontent.com/u/86839778?v=4?s=100" width="100px;" alt="Suwan Sankaja"/><br /><sub><b>Suwan Sankaja</b></sub></a><br /><a href="#translation-SuwanSankaja" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Iamalok007"><img src="https://avatars.githubusercontent.com/u/97467835?v=4?s=100" width="100px;" alt="alok"/><br /><sub><b>alok</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Iamalok007" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dlvideira"><img src="https://avatars.githubusercontent.com/u/53951425?v=4?s=100" width="100px;" alt="Daniel Lisboa"/><br /><sub><b>Daniel Lisboa</b></sub></a><br /><a href="#translation-dlvideira" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ComplexOW"><img src="https://avatars.githubusercontent.com/u/105279107?v=4?s=100" width="100px;" alt="Sam Powell"/><br /><sub><b>Sam Powell</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ComplexOW" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jppf22"><img src="https://avatars.githubusercontent.com/u/104360594?v=4?s=100" width="100px;" alt="João Fernandes"/><br /><sub><b>João Fernandes</b></sub></a><br /><a href="#translation-jppf22" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/HongGeonUi"><img src="https://avatars.githubusercontent.com/u/89684956?v=4?s=100" width="100px;" alt="Hong Geon-ui"/><br /><sub><b>Hong Geon-ui</b></sub></a><br /><a href="#translation-HongGeonUi" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ylcn91"><img src="https://avatars.githubusercontent.com/u/7249450?v=4?s=100" width="100px;" alt="Doksanbir"/><br /><sub><b>Doksanbir</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ylcn91" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=ylcn91" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aylcn91" title="Reviewed Pull Requests">👀</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Chant3ll3"><img src="https://avatars.githubusercontent.com/u/141697333?v=4?s=100" width="100px;" alt="Chant3ll3"/><br /><sub><b>Chant3ll3</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Chant3ll3" title="Documentation">📖</a> <a href="#translation-Chant3ll3" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://hwan33.tistory.com/"><img src="https://avatars.githubusercontent.com/u/67625677?v=4?s=100" width="100px;" alt="YongHwan Kwon"/><br /><sub><b>YongHwan Kwon</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hwan33" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/takikuba"><img src="https://avatars.githubusercontent.com/u/58841343?v=4?s=100" width="100px;" alt="Jakub Klimek"/><br /><sub><b>Jakub Klimek</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=takikuba" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/bachbil"><img src="https://avatars.githubusercontent.com/u/28935461?v=4?s=100" width="100px;" alt="believe"/><br /><sub><b>believe</b></sub></a><br /><a href="#translation-bachbil" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/egg0102030405"><img src="https://avatars.githubusercontent.com/u/59650695?v=4?s=100" width="100px;" alt="egg0102030405"/><br /><sub><b>egg0102030405</b></sub></a><br /><a href="#translation-egg0102030405" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=egg0102030405" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ved-asole"><img src="https://avatars.githubusercontent.com/u/77259804?v=4?s=100" width="100px;" alt="Ved Asole"/><br /><sub><b>Ved Asole</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ved-asole" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Holiday-C"><img src="https://avatars.githubusercontent.com/u/95869761?v=4?s=100" width="100px;" alt="NewMorning"/><br /><sub><b>NewMorning</b></sub></a><br /><a href="#translation-Holiday-C" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Kiro-Young"><img src="https://avatars.githubusercontent.com/u/98251397?v=4?s=100" width="100px;" alt="资深老萌新"/><br /><sub><b>资深老萌新</b></sub></a><br /><a href="#translation-Kiro-Young" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://itistori.tistory.com/"><img src="https://avatars.githubusercontent.com/u/113348293?v=4?s=100" width="100px;" alt="Seunghwan Jeon"/><br /><sub><b>Seunghwan Jeon</b></sub></a><br /><a href="#translation-Nickolodeon98" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sugan0tech"><img src="https://avatars.githubusercontent.com/u/71312159?v=4?s=100" width="100px;" alt="sugavanesh"/><br /><sub><b>sugavanesh</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sugan0tech" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/FinnS-F"><img src="https://avatars.githubusercontent.com/u/126026830?v=4?s=100" width="100px;" alt="FinnS-F"/><br /><sub><b>FinnS-F</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=FinnS-F" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jerryyummy"><img src="https://avatars.githubusercontent.com/u/62087610?v=4?s=100" width="100px;" alt="jerryyummy"/><br /><sub><b>jerryyummy</b></sub></a><br /><a href="#translation-jerryyummy" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://manojkumarchow.github.io/"><img src="https://avatars.githubusercontent.com/u/28005510?v=4?s=100" width="100px;" alt="Manoj Chowdary"/><br /><sub><b>Manoj Chowdary</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Manojkumarchow" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MaverickWingman"><img src="https://avatars.githubusercontent.com/u/76624290?v=4?s=100" width="100px;" alt="Aditya"/><br /><sub><b>Aditya</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MaverickWingman" title="Documentation">📖</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=MaverickWingman" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/nooynayr"><img src="https://avatars.githubusercontent.com/u/141696269?v=4?s=100" width="100px;" alt="nooynayr"/><br /><sub><b>nooynayr</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=nooynayr" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/pushpander1010"><img src="https://avatars.githubusercontent.com/u/41006191?v=4?s=100" width="100px;" alt="CYBERCRUX2"/><br /><sub><b>CYBERCRUX2</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=pushpander1010" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/luismateoh"><img src="https://avatars.githubusercontent.com/u/44934142?v=4?s=100" width="100px;" alt="Luis Mateo Hincapié Martinez"/><br /><sub><b>Luis Mateo Hincapié Martinez</b></sub></a><br /><a href="#translation-luismateoh" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3Aluismateoh" title="Reviewed Pull Requests">👀</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://guqing.io"><img src="https://avatars.githubusercontent.com/u/38999863?v=4?s=100" width="100px;" alt="guqing"/><br /><sub><b>guqing</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=guqing" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sashirestela"><img src="https://avatars.githubusercontent.com/u/14045506?v=4?s=100" width="100px;" alt="Sashir Estela"/><br /><sub><b>Sashir Estela</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sashirestela" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/omahs"><img src="https://avatars.githubusercontent.com/u/73983677?v=4?s=100" width="100px;" alt="omahs"/><br /><sub><b>omahs</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=omahs" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/leiferksn"><img src="https://avatars.githubusercontent.com/u/4026636?v=4?s=100" width="100px;" alt="leif e."/><br /><sub><b>leif e.</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=leiferksn" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://junhkang.tistory.com/"><img src="https://avatars.githubusercontent.com/u/20232155?v=4?s=100" width="100px;" alt="Jun Kang"/><br /><sub><b>Jun Kang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=junhkang" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/KishalayP"><img src="https://avatars.githubusercontent.com/u/71012321?v=4?s=100" width="100px;" alt="Kishalay Pandey"/><br /><sub><b>Kishalay Pandey</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=KishalayP" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/drishtii7"><img src="https://avatars.githubusercontent.com/u/82076566?v=4?s=100" width="100px;" alt="drishtii7"/><br /><sub><b>drishtii7</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=drishtii7" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/DavidMedinaO"><img src="https://avatars.githubusercontent.com/u/53974843?v=4?s=100" width="100px;" alt="David Medina Orozco"/><br /><sub><b>David Medina Orozco</b></sub></a><br /><a href="#translation-DavidMedinaO" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3ADavidMedinaO" title="Reviewed Pull Requests">👀</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Romo4ka-bot"><img src="https://avatars.githubusercontent.com/u/61774094?v=4?s=100" width="100px;" alt="Roman Leontev"/><br /><sub><b>Roman Leontev</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Romo4ka-bot" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Ehspresso"><img src="https://avatars.githubusercontent.com/u/144370752?v=4?s=100" width="100px;" alt="Riley"/><br /><sub><b>Riley</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Ehspresso" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/k1w1dev"><img src="https://avatars.githubusercontent.com/u/121696782?v=4?s=100" width="100px;" alt="k1w1dev"/><br /><sub><b>k1w1dev</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=k1w1dev" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dev-yugantar"><img src="https://avatars.githubusercontent.com/u/153066190?v=4?s=100" width="100px;" alt="dev-yugantar"/><br /><sub><b>dev-yugantar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dev-yugantar" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Adelechka"><img src="https://avatars.githubusercontent.com/u/65678470?v=4?s=100" width="100px;" alt="Adelya"/><br /><sub><b>Adelya</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Adelechka" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/gatlanagaprasanna"><img src="https://avatars.githubusercontent.com/u/154739216?v=4?s=100" width="100px;" alt="gatlanagaprasanna"/><br /><sub><b>gatlanagaprasanna</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=gatlanagaprasanna" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Avinash2110"><img src="https://avatars.githubusercontent.com/u/37360069?v=4?s=100" width="100px;" alt="Avinash Shukla"/><br /><sub><b>Avinash Shukla</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Avinash2110" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Mayankchoudhary294"><img src="https://avatars.githubusercontent.com/u/97609699?v=4?s=100" width="100px;" alt="Mayank Choudhary"/><br /><sub><b>Mayank Choudhary</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Mayankchoudhary294" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/romannimets"><img src="https://avatars.githubusercontent.com/u/137268574?v=4?s=100" width="100px;" alt="romannimets"/><br /><sub><b>romannimets</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=romannimets" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Joel-Dandin"><img src="https://avatars.githubusercontent.com/u/60149879?v=4?s=100" width="100px;" alt="Joel"/><br /><sub><b>Joel</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Joel-Dandin" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/244Walyson"><img src="https://avatars.githubusercontent.com/u/125759796?v=4?s=100" width="100px;" alt="Walyson Moises"/><br /><sub><b>Walyson Moises</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=244Walyson" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Xcyq"><img src="https://avatars.githubusercontent.com/u/39086666?v=4?s=100" width="100px;" alt="Xcyq"/><br /><sub><b>Xcyq</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Xcyq" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Ritabrata1080"><img src="https://avatars.githubusercontent.com/u/60834250?v=4?s=100" width="100px;" alt="Ritabrata"/><br /><sub><b>Ritabrata</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/pulls?q=is%3Apr+reviewed-by%3ARitabrata1080" title="Reviewed Pull Requests">👀</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/trivikr"><img src="https://avatars.githubusercontent.com/u/16024985?v=4?s=100" width="100px;" alt="Trivikram Kamat"/><br /><sub><b>Trivikram Kamat</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=trivikr" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/vvanghelle"><img src="https://avatars.githubusercontent.com/u/3204600?v=4?s=100" width="100px;" alt="Vincent Vanghelle"/><br /><sub><b>Vincent Vanghelle</b></sub></a><br /><a href="#translation-vvanghelle" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/antoheri"><img src="https://avatars.githubusercontent.com/u/79988396?v=4?s=100" width="100px;" alt="Antoine Héritier"/><br /><sub><b>Antoine Héritier</b></sub></a><br /><a href="#translation-antoheri" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/fishandsheep"><img src="https://avatars.githubusercontent.com/u/43347407?v=4?s=100" width="100px;" alt="QinShower"/><br /><sub><b>QinShower</b></sub></a><br /><a href="#translation-fishandsheep" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/LakshyaPunyani-01"><img src="https://avatars.githubusercontent.com/u/103628913?v=4?s=100" width="100px;" alt="LakshyaPunyani-01"/><br /><sub><b>LakshyaPunyani-01</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=LakshyaPunyani-01" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jasonjyu"><img src="https://avatars.githubusercontent.com/u/10333076?v=4?s=100" width="100px;" alt="jasonjyu"/><br /><sub><b>jasonjyu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jasonjyu" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jeffmorrison"><img src="https://avatars.githubusercontent.com/u/26047158?v=4?s=100" width="100px;" alt="jeffmorrison"/><br /><sub><b>jeffmorrison</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=jeffmorrison" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dmgodoy"><img src="https://avatars.githubusercontent.com/u/10840681?v=4?s=100" width="100px;" alt="David M."/><br /><sub><b>David M.</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=dmgodoy" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/apophizzz"><img src="https://avatars.githubusercontent.com/u/12052783?v=4?s=100" width="100px;" alt="Patrick Kleindienst"/><br /><sub><b>Patrick Kleindienst</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=apophizzz" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/proceane"><img src="https://avatars.githubusercontent.com/u/62143949?v=4?s=100" width="100px;" alt="Juyeon"/><br /><sub><b>Juyeon</b></sub></a><br /><a href="#translation-proceane" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://mammadyahya.vercel.app"><img src="https://avatars.githubusercontent.com/u/66476643?v=4?s=100" width="100px;" alt="Mammad Yahyayev"/><br /><sub><b>Mammad Yahyayev</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mammadyahyayev" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/SalmaAzeem"><img src="https://avatars.githubusercontent.com/u/121863224?v=4?s=100" width="100px;" alt="Salma"/><br /><sub><b>Salma</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SalmaAzeem" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://codemaverick-143.github.io/My-Portfolio/"><img src="https://avatars.githubusercontent.com/u/182847716?v=4?s=100" width="100px;" alt="Arpit Sarang"/><br /><sub><b>Arpit Sarang</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=CodeMaverick-143" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/mayatarek"><img src="https://avatars.githubusercontent.com/u/111644421?v=4?s=100" width="100px;" alt="Maya"/><br /><sub><b>Maya</b></sub></a><br /><a href="#translation-mayatarek" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/HabibaMekay"><img src="https://avatars.githubusercontent.com/u/133516736?v=4?s=100" width="100px;" alt="HabibaMekay"/><br /><sub><b>HabibaMekay</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HabibaMekay" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Ahmed-Taha-981"><img src="https://avatars.githubusercontent.com/u/122402269?v=4?s=100" width="100px;" alt="Ahmed-Taha-981"/><br /><sub><b>Ahmed-Taha-981</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Ahmed-Taha-981" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://malakelbanna.netlify.app/"><img src="https://avatars.githubusercontent.com/u/67643605?v=4?s=100" width="100px;" alt="Malak Elbanna"/><br /><sub><b>Malak Elbanna</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=malak-elbanna" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/depthlending"><img src="https://avatars.githubusercontent.com/u/164312726?v=4?s=100" width="100px;" alt="BiKangNing"/><br /><sub><b>BiKangNing</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=depthlending" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/TarunVishwakarma1"><img src="https://avatars.githubusercontent.com/u/138651451?v=4?s=100" width="100px;" alt="Tarun Vishwakarma"/><br /><sub><b>Tarun Vishwakarma</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=TarunVishwakarma1" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/shahdhoss"><img src="https://avatars.githubusercontent.com/u/132148556?v=4?s=100" width="100px;" alt="Shahd Hossam"/><br /><sub><b>Shahd Hossam</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=shahdhoss" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://mehdirahimi.github.io"><img src="https://avatars.githubusercontent.com/u/24210842?v=4?s=100" width="100px;" alt="Mehdi Rahimi"/><br /><sub><b>Mehdi Rahimi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=mehdirahimi" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/clintaire"><img src="https://avatars.githubusercontent.com/u/111376518?v=4?s=100" width="100px;" alt="Clint Airé"/><br /><sub><b>Clint Airé</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=clintaire" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/darkhyper24"><img src="https://avatars.githubusercontent.com/u/132711528?v=4?s=100" width="100px;" alt="darkhyper24"/><br /><sub><b>darkhyper24</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=darkhyper24" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MohanedAtef238"><img src="https://avatars.githubusercontent.com/u/105852138?v=4?s=100" width="100px;" alt="Mohaned Atef"/><br /><sub><b>Mohaned Atef</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MohanedAtef238" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/maximevtush"><img src="https://avatars.githubusercontent.com/u/154841002?v=4?s=100" width="100px;" alt="Maxim Evtush"/><br /><sub><b>Maxim Evtush</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=maximevtush" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/hvgh88"><img src="https://avatars.githubusercontent.com/u/65297242?v=4?s=100" width="100px;" alt="Harshita Vidapanakal"/><br /><sub><b>Harshita Vidapanakal</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=hvgh88" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/smile-ab"><img src="https://avatars.githubusercontent.com/u/202159894?v=4?s=100" width="100px;" alt="smile-ab"/><br /><sub><b>smile-ab</b></sub></a><br /><a href="#translation-smile-ab" title="Translation">🌍</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=smile-ab" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Francisco-G-P"><img src="https://avatars.githubusercontent.com/u/186766789?v=4?s=100" width="100px;" alt="Francisco-G-P"/><br /><sub><b>Francisco-G-P</b></sub></a><br /><a href="#translation-Francisco-G-P" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Duartegdm"><img src="https://avatars.githubusercontent.com/u/137895372?v=4?s=100" width="100px;" alt="Gabriel Duarte"/><br /><sub><b>Gabriel Duarte</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Duartegdm" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/DenizAltunkapan"><img src="https://avatars.githubusercontent.com/u/93663085?v=4?s=100" width="100px;" alt="Deniz Altunkapan"/><br /><sub><b>Deniz Altunkapan</b></sub></a><br /><a href="#translation-DenizAltunkapan" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/johnklint81"><img src="https://avatars.githubusercontent.com/u/70539458?v=4?s=100" width="100px;" alt="John Klint"/><br /><sub><b>John Klint</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=johnklint81" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sanurah"><img src="https://avatars.githubusercontent.com/u/16178588?v=4?s=100" width="100px;" alt="Sanura Hettiarachchi"/><br /><sub><b>Sanura Hettiarachchi</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=sanurah" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/2897robo"><img src="https://avatars.githubusercontent.com/u/31699375?v=4?s=100" width="100px;" alt="Kim Gi Uk"/><br /><sub><b>Kim Gi Uk</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=2897robo" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Suchismita-Deb"><img src="https://avatars.githubusercontent.com/u/68535074?v=4?s=100" width="100px;" alt="Suchismita Deb"/><br /><sub><b>Suchismita Deb</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Suchismita-Deb" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/ssrijan-007-sys"><img src="https://avatars.githubusercontent.com/u/137605821?v=4?s=100" width="100px;" alt="ssrijan-007-sys"/><br /><sub><b>ssrijan-007-sys</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ssrijan-007-sys" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/e5LA"><img src="https://avatars.githubusercontent.com/u/208197507?v=4?s=100" width="100px;" alt="e5LA"/><br /><sub><b>e5LA</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=e5LA" title="Code">💻</a> <a href="https://github.com/iluwatar/java-design-patterns/commits?author=e5LA" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="http://maziyar-gerami.github.io/portfolio/"><img src="https://avatars.githubusercontent.com/u/122622721?v=4?s=100" width="100px;" alt="Maziyar Gerami"/><br /><sub><b>Maziyar Gerami</b></sub></a><br /><a href="#translation-maziyar-gerami" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/yybmion"><img src="https://avatars.githubusercontent.com/u/113106136?v=4?s=100" width="100px;" alt="yoobin_mion"/><br /><sub><b>yoobin_mion</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=yybmion" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://ronodhirsoumik.github.io"><img src="https://avatars.githubusercontent.com/u/46843689?v=4?s=100" width="100px;" alt="Soumik Sarker"/><br /><sub><b>Soumik Sarker</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=ronodhirSoumik" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/naman-sriv"><img src="https://avatars.githubusercontent.com/u/82610773?v=4?s=100" width="100px;" alt="Naman Srivastava"/><br /><sub><b>Naman Srivastava</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=naman-sriv" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/letdtcode"><img src="https://avatars.githubusercontent.com/u/92111552?v=4?s=100" width="100px;" alt="Thanh Nguyen Duc"/><br /><sub><b>Thanh Nguyen Duc</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=letdtcode" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/skamble2"><img src="https://avatars.githubusercontent.com/u/121136639?v=4?s=100" width="100px;" alt="Soham Kamble"/><br /><sub><b>Soham Kamble</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=skamble2" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Olexandr88"><img src="https://avatars.githubusercontent.com/u/93856062?v=4?s=100" width="100px;" alt="Olexandr88"/><br /><sub><b>Olexandr88</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Olexandr88" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/nilsreichardt"><img src="https://avatars.githubusercontent.com/u/24459435?v=4?s=100" width="100px;" alt="Nils Reichardt"/><br /><sub><b>Nils Reichardt</b></sub></a><br /><a href="#security-nilsreichardt" title="Security">🛡️</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="http://www.northecho.dev"><img src="https://avatars.githubusercontent.com/u/122107484?v=4?s=100" width="100px;" alt="Christopher Lusk"/><br /><sub><b>Christopher Lusk</b></sub></a><br /><a href="#security-north-echo" title="Security">🛡️</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/dagecko"><img src="https://avatars.githubusercontent.com/u/6371704?v=4?s=100" width="100px;" alt="dagecko"/><br /><sub><b>dagecko</b></sub></a><br /><a href="#security-dagecko" title="Security">🛡️</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/jackmisbach"><img src="https://avatars.githubusercontent.com/u/183796460?v=4?s=100" width="100px;" alt="jackmisbach"/><br /><sub><b>jackmisbach</b></sub></a><br /><a href="#security-jackmisbach" title="Security">🛡️</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/avivdon"><img src="https://avatars.githubusercontent.com/u/74790003?v=4?s=100" width="100px;" alt="avivdon"/><br /><sub><b>avivdon</b></sub></a><br /><a href="#security-avivdon" title="Security">🛡️</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/quantdevv"><img src="https://avatars.githubusercontent.com/u/56085648?v=4?s=100" width="100px;" alt="Aditya Kumawat"/><br /><sub><b>Aditya Kumawat</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=quantdevv" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/devch37"><img src="https://avatars.githubusercontent.com/u/72903623?v=4?s=100" width="100px;" alt="devch37"/><br /><sub><b>devch37</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=devch37" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/HY-love-sleep"><img src="https://avatars.githubusercontent.com/u/73268470?v=4?s=100" width="100px;" alt="HY-love-sleep"/><br /><sub><b>HY-love-sleep</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=HY-love-sleep" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="http://www.cmd137blog.top/"><img src="https://avatars.githubusercontent.com/u/56242956?v=4?s=100" width="100px;" alt="CMD137"/><br /><sub><b>CMD137</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=CMD137" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/QuantumRange"><img src="https://avatars.githubusercontent.com/u/49843948?v=4?s=100" width="100px;" alt="QuantumRange"/><br /><sub><b>QuantumRange</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=QuantumRange" title="Documentation">📖</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Dhiraj-birajdar"><img src="https://avatars.githubusercontent.com/u/114354331?v=4?s=100" width="100px;" alt="Dhiraj Birajdar"/><br /><sub><b>Dhiraj Birajdar</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Dhiraj-birajdar" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/sieberss"><img src="https://avatars.githubusercontent.com/u/178474619?v=4?s=100" width="100px;" alt="Stefan Siebers"/><br /><sub><b>Stefan Siebers</b></sub></a><br /><a href="#translation-sieberss" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://orbisappsec.com/"><img src="https://avatars.githubusercontent.com/u/242526317?v=4?s=100" width="100px;" alt="OrbisAI Security"/><br /><sub><b>OrbisAI Security</b></sub></a><br /><a href="#security-orbisai0security" title="Security">🛡️</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://www.rajugupta.com/portfolio/"><img src="https://avatars.githubusercontent.com/u/64011583?v=4?s=100" width="100px;" alt="Raju Gupta"/><br /><sub><b>Raju Gupta</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=rranjangupta" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/alex052525"><img src="https://avatars.githubusercontent.com/u/116088682?v=4?s=100" width="100px;" alt="김정모"/><br /><sub><b>김정모</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=alex052525" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/AnakinYen0329"><img src="https://avatars.githubusercontent.com/u/122139183?v=4?s=100" width="100px;" alt="Anakin Yen"/><br /><sub><b>Anakin Yen</b></sub></a><br /><a href="#translation-AnakinYen0329" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/SrGiuliano77"><img src="https://avatars.githubusercontent.com/u/128543464?v=4?s=100" width="100px;" alt="Giuliano Oliveira"/><br /><sub><b>Giuliano Oliveira</b></sub></a><br /><a href="#translation-SrGiuliano77" title="Translation">🌍</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://www.priyanshu-portfolio.co.in"><img src="https://avatars.githubusercontent.com/u/222148451?v=4?s=100" width="100px;" alt="Priyanshu"/><br /><sub><b>Priyanshu</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=priyanshuvishwakarma273403" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/arnabnandy-cognizant"><img src="https://avatars.githubusercontent.com/u/5053648?v=4?s=100" width="100px;" alt="Arnab Nandy"/><br /><sub><b>Arnab Nandy</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=arnabnandy7" title="Documentation">📖</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/MohamedMBG"><img src="https://avatars.githubusercontent.com/u/123114744?v=4?s=100" width="100px;" alt="BAGHDAD Mohamed"/><br /><sub><b>BAGHDAD Mohamed</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=MohamedMBG" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/AnveshSrivastava"><img src="https://avatars.githubusercontent.com/u/170334970?v=4?s=100" width="100px;" alt="Anvesh Srivastava"/><br /><sub><b>Anvesh Srivastava</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=AnveshSrivastava" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/Mukul-Howale"><img src="https://avatars.githubusercontent.com/u/110479646?v=4?s=100" width="100px;" alt="Mukul Howale"/><br /><sub><b>Mukul Howale</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=Mukul-Howale" title="Code">💻</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/SandhyaDevadiga"><img src="https://avatars.githubusercontent.com/u/128058717?v=4?s=100" width="100px;" alt="Sandhya"/><br /><sub><b>Sandhya</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=SandhyaDevadiga" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/devikae"><img src="https://avatars.githubusercontent.com/u/98100047?v=4?s=100" width="100px;" alt="dev-ikae"/><br /><sub><b>dev-ikae</b></sub></a><br /><a href="https://github.com/iluwatar/java-design-patterns/commits?author=devikae" title="Code">💻</a></td>
|
||||||
|
<td align="center" valign="top" width="16.66%"><a href="https://github.com/zanarellidev"><img src="https://avatars.githubusercontent.com/u/268068569?v=4?s=100" width="100px;" alt="zanarelli"/><br /><sub><b>zanarelli</b></sub></a><br /><a href="#translation-zanarellidev" title="Translation">🌍</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
+84
-43
@@ -1,25 +1,29 @@
|
|||||||
---
|
---
|
||||||
title: Abstract Document
|
title: "Abstract Document Pattern in Java: Simplifying Data Handling with Flexibility"
|
||||||
|
shortTitle: Abstract Document
|
||||||
|
description: "Explore the Abstract Document design pattern in Java. Learn its intent, explanation, applicability, benefits, and see real-world examples to implement flexible and dynamic data structures."
|
||||||
category: Structural
|
category: Structural
|
||||||
language: en
|
language: en
|
||||||
tag:
|
tag:
|
||||||
|
- Abstraction
|
||||||
|
- Decoupling
|
||||||
|
- Dynamic typing
|
||||||
|
- Encapsulation
|
||||||
- Extensibility
|
- Extensibility
|
||||||
|
- Polymorphism
|
||||||
---
|
---
|
||||||
|
|
||||||
## Intent
|
## Intent of Abstract Document Design Pattern
|
||||||
|
|
||||||
The "Abstract Document" design pattern is a structural design pattern that aims to provide a consistent way to handle
|
The Abstract Document design pattern in Java is a crucial structural design pattern that provides a consistent way to handle hierarchical and tree-like data structures by defining a common interface for various document types. It separates the core document structure from specific data formats, enabling dynamic updates and simplified maintenance.
|
||||||
hierarchical and tree-like data structures by defining a common interface for various document types.
|
|
||||||
|
|
||||||
## Explanation
|
## Detailed Explanation of Abstract Document Pattern with Real-World Examples
|
||||||
|
|
||||||
The Abstract Document pattern enables handling additional, non-static properties. This pattern
|
The Abstract Document design pattern in Java allows dynamic handling of non-static properties. This pattern uses concept of traits to enable type safety and separate properties of different classes into set of interfaces.
|
||||||
uses concept of traits to enable type safety and separate properties of different classes into
|
|
||||||
set of interfaces.
|
|
||||||
|
|
||||||
Real world example
|
Real-world example
|
||||||
|
|
||||||
> Consider a car that consists of multiple parts. However, we don't know if the specific car really has all the parts, or just some of them. Our cars are dynamic and extremely flexible.
|
> Consider a library system implementing the Abstract Document design pattern in Java, where books can have diverse formats and attributes: physical books, eBooks, and audiobooks. Each format has unique properties, such as page count for physical books, file size for eBooks, and duration for audiobooks. The Abstract Document design pattern allows the library system to manage these diverse formats flexibly. By using this pattern, the system can store and retrieve properties dynamically, without needing a rigid structure for each book type, making it easier to add new formats or attributes in the future without significant changes to the codebase.
|
||||||
|
|
||||||
In plain words
|
In plain words
|
||||||
|
|
||||||
@@ -27,16 +31,18 @@ In plain words
|
|||||||
|
|
||||||
Wikipedia says
|
Wikipedia says
|
||||||
|
|
||||||
> An object-oriented structural design pattern for organizing objects in loosely typed key-value stores and exposing
|
> An object-oriented structural design pattern for organizing objects in loosely typed key-value stores and exposing the data using typed views. The purpose of the pattern is to achieve a high degree of flexibility between components in a strongly typed language where new properties can be added to the object-tree on the fly, without losing the support of type-safety. The pattern makes use of traits to separate different properties of a class into different interfaces.
|
||||||
the data using typed views. The purpose of the pattern is to achieve a high degree of flexibility between components
|
|
||||||
in a strongly typed language where new properties can be added to the object-tree on the fly, without losing the
|
|
||||||
support of type-safety. The pattern makes use of traits to separate different properties of a class into different
|
|
||||||
interfaces.
|
|
||||||
|
|
||||||
**Programmatic Example**
|
Class diagram
|
||||||
|
|
||||||
Let's first define the base classes `Document` and `AbstractDocument`. They basically make the object hold a property
|

|
||||||
map and any amount of child objects.
|
|
||||||
|
|
||||||
|
## Programmatic Example of Abstract Document Pattern in Java
|
||||||
|
|
||||||
|
Consider a car that consists of multiple parts. However, we don't know if the specific car really has all the parts, or just some of them. Our cars are dynamic and extremely flexible.
|
||||||
|
|
||||||
|
Let's first define the base classes `Document` and `AbstractDocument`. They basically make the object hold a property map and any amount of child objects.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public interface Document {
|
public interface Document {
|
||||||
@@ -78,11 +84,12 @@ public abstract class AbstractDocument implements Document {
|
|||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.map(constructor);
|
.map(constructor);
|
||||||
}
|
}
|
||||||
...
|
|
||||||
|
// Other properties and methods...
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Next we define an enum `Property` and a set of interfaces for type, price, model and parts. This allows us to create
|
|
||||||
static looking interface to our `Car` class.
|
Next we define an enum `Property` and a set of interfaces for type, price, model and parts. This allows us to create static looking interface to our `Car` class.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public enum Property {
|
public enum Property {
|
||||||
@@ -103,6 +110,7 @@ public interface HasPrice extends Document {
|
|||||||
return Optional.ofNullable((Number) get(Property.PRICE.toString()));
|
return Optional.ofNullable((Number) get(Property.PRICE.toString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface HasModel extends Document {
|
public interface HasModel extends Document {
|
||||||
|
|
||||||
default Optional<String> getModel() {
|
default Optional<String> getModel() {
|
||||||
@@ -116,6 +124,13 @@ public interface HasParts extends Document {
|
|||||||
return children(Property.PARTS.toString(), Part::new);
|
return children(Property.PARTS.toString(), Part::new);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class Part extends AbstractDocument implements HasType, HasModel, HasPrice {
|
||||||
|
|
||||||
|
public Part(Map<String, Object> properties) {
|
||||||
|
super(properties);
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Now we are ready to introduce the `Car`.
|
Now we are ready to introduce the `Car`.
|
||||||
@@ -132,6 +147,7 @@ public class Car extends AbstractDocument implements HasModel, HasPrice, HasPart
|
|||||||
And finally here's how we construct and use the `Car` in a full example.
|
And finally here's how we construct and use the `Car` in a full example.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
public static void main(String[] args) {
|
||||||
LOGGER.info("Constructing parts and car");
|
LOGGER.info("Constructing parts and car");
|
||||||
|
|
||||||
var wheelProperties = Map.of(
|
var wheelProperties = Map.of(
|
||||||
@@ -160,25 +176,24 @@ And finally here's how we construct and use the `Car` in a full example.
|
|||||||
p.getModel().orElse(null),
|
p.getModel().orElse(null),
|
||||||
p.getPrice().orElse(null))
|
p.getPrice().orElse(null))
|
||||||
);
|
);
|
||||||
|
}
|
||||||
// Constructing parts and car
|
|
||||||
// Here is our car:
|
|
||||||
// model: 300SL
|
|
||||||
// price: 10000
|
|
||||||
// parts:
|
|
||||||
// wheel/15C/100
|
|
||||||
// door/Lambo/300
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Class diagram
|
The program output:
|
||||||
|
|
||||||

|
```
|
||||||
|
07:21:57.391 [main] INFO com.iluwatar.abstractdocument.App -- Constructing parts and car
|
||||||
|
07:21:57.393 [main] INFO com.iluwatar.abstractdocument.App -- Here is our car:
|
||||||
|
07:21:57.393 [main] INFO com.iluwatar.abstractdocument.App -- -> model: 300SL
|
||||||
|
07:21:57.394 [main] INFO com.iluwatar.abstractdocument.App -- -> price: 10000
|
||||||
|
07:21:57.394 [main] INFO com.iluwatar.abstractdocument.App -- -> parts:
|
||||||
|
07:21:57.395 [main] INFO com.iluwatar.abstractdocument.App -- wheel/15C/100
|
||||||
|
07:21:57.395 [main] INFO com.iluwatar.abstractdocument.App -- door/Lambo/300
|
||||||
|
```
|
||||||
|
|
||||||
## Applicability
|
## When to Use the Abstract Document Pattern in Java
|
||||||
|
|
||||||
This pattern is particularly useful in scenarios where you have different types of documents that share some common
|
The Abstract Document design pattern is especially beneficial in scenarios requiring management of different document types in Java that share some common attributes or behaviors, but also have unique attributes or behaviors specific to their individual types. Here are some scenarios where the Abstract Document design pattern can be applicable:
|
||||||
attributes or behaviors, but also have unique attributes or behaviors specific to their individual types. Here are
|
|
||||||
some scenarios where the Abstract Document design pattern can be applicable:
|
|
||||||
|
|
||||||
* Content Management Systems (CMS): In a CMS, you might have various types of content such as articles, images, videos, etc. Each type of content could have shared attributes like creation date, author, and tags, while also having specific attributes like image dimensions for images or video duration for videos.
|
* Content Management Systems (CMS): In a CMS, you might have various types of content such as articles, images, videos, etc. Each type of content could have shared attributes like creation date, author, and tags, while also having specific attributes like image dimensions for images or video duration for videos.
|
||||||
|
|
||||||
@@ -194,13 +209,39 @@ some scenarios where the Abstract Document design pattern can be applicable:
|
|||||||
|
|
||||||
* Project Management Tools: In project management applications, you could have different types of tasks like to-do items, milestones, and issues. The Abstract Document pattern could be used to handle general attributes like task name and assignee, while allowing for specific attributes like milestone date or issue priority.
|
* Project Management Tools: In project management applications, you could have different types of tasks like to-do items, milestones, and issues. The Abstract Document pattern could be used to handle general attributes like task name and assignee, while allowing for specific attributes like milestone date or issue priority.
|
||||||
|
|
||||||
The key idea behind the Abstract Document design pattern is to provide a flexible and extensible way to manage different
|
* Documents have diverse and evolving attribute structures.
|
||||||
types of documents or entities with shared and distinct attributes. By defining a common interface and implementing it
|
|
||||||
across various document types, you can achieve a more organized and consistent approach to handling complex data
|
|
||||||
structures.
|
|
||||||
|
|
||||||
## Credits
|
* Dynamically adding new properties is a common requirement.
|
||||||
|
|
||||||
* [Wikipedia: Abstract Document Pattern](https://en.wikipedia.org/wiki/Abstract_Document_Pattern)
|
* Decoupling data access from specific formats is crucial.
|
||||||
* [Martin Fowler: Dealing with properties](http://martinfowler.com/apsupp/properties.pdf)
|
|
||||||
* [Pattern-Oriented Software Architecture Volume 4: A Pattern Language for Distributed Computing (v. 4)](https://www.amazon.com/gp/product/0470059028/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0470059028&linkId=e3aacaea7017258acf184f9f3283b492)
|
* Maintainability and flexibility are critical for the codebase.
|
||||||
|
|
||||||
|
The key idea behind the Abstract Document design pattern is to provide a flexible and extensible way to manage different types of documents or entities with shared and distinct attributes. By defining a common interface and implementing it across various document types, you can achieve a more organized and consistent approach to handling complex data structures.
|
||||||
|
|
||||||
|
## Benefits and Trade-offs of Abstract Document Pattern
|
||||||
|
|
||||||
|
Benefits:
|
||||||
|
|
||||||
|
* Flexibility: Accommodates varied document structures and properties.
|
||||||
|
|
||||||
|
* Extensibility: Dynamically add new attributes without breaking existing code.
|
||||||
|
|
||||||
|
* Maintainability: Promotes clean and adaptable code due to separation of concerns.
|
||||||
|
|
||||||
|
* Reusability: Typed views enable code reuse for accessing specific attribute types.
|
||||||
|
|
||||||
|
Trade-offs:
|
||||||
|
|
||||||
|
* Complexity: Requires defining interfaces and views, adding implementation overhead.
|
||||||
|
|
||||||
|
* Performance: Might introduce slight performance overhead compared to direct data access.
|
||||||
|
|
||||||
|
## References and Credits
|
||||||
|
|
||||||
|
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI)
|
||||||
|
* [Java Design Patterns: A Hands-On Experience with Real-World Examples](https://amzn.to/3yhh525)
|
||||||
|
* [Pattern-Oriented Software Architecture Volume 4: A Pattern Language for Distributed Computing (v. 4)](https://amzn.to/49zRP4R)
|
||||||
|
* [Patterns of Enterprise Application Architecture](https://amzn.to/3WfKBPR)
|
||||||
|
* [Abstract Document Pattern (Wikipedia)](https://en.wikipedia.org/wiki/Abstract_Document_Pattern)
|
||||||
|
* [Dealing with Properties (Martin Fowler)](http://martinfowler.com/apsupp/properties.pdf)
|
||||||
@@ -34,6 +34,14 @@
|
|||||||
</parent>
|
</parent>
|
||||||
<artifactId>abstract-document</artifactId>
|
<artifactId>abstract-document</artifactId>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter-engine</artifactId>
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
|||||||
+35
-12
@@ -31,48 +31,71 @@ import java.util.Objects;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/** Abstract implementation of Document interface. */
|
||||||
* Abstract implementation of Document interface.
|
|
||||||
*/
|
|
||||||
public abstract class AbstractDocument implements Document {
|
public abstract class AbstractDocument implements Document {
|
||||||
|
|
||||||
private final Map<String, Object> properties;
|
private final Map<String, Object> documentProperties;
|
||||||
|
|
||||||
protected AbstractDocument(Map<String, Object> properties) {
|
protected AbstractDocument(Map<String, Object> properties) {
|
||||||
Objects.requireNonNull(properties, "properties map is required");
|
Objects.requireNonNull(properties, "properties map is required");
|
||||||
this.properties = properties;
|
this.documentProperties = properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void put(String key, Object value) {
|
public Void put(String key, Object value) {
|
||||||
properties.put(key, value);
|
documentProperties.put(key, value);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object get(String key) {
|
public Object get(String key) {
|
||||||
return properties.get(key);
|
return documentProperties.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> Stream<T> children(String key, Function<Map<String, Object>, T> constructor) {
|
public <T> Stream<T> children(String key, Function<Map<String, Object>, T> childConstructor) {
|
||||||
return Stream.ofNullable(get(key))
|
return Stream.ofNullable(get(key))
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.map(el -> (List<Map<String, Object>>) el)
|
.map(el -> (List<Map<String, Object>>) el)
|
||||||
.findAny()
|
.findAny()
|
||||||
.stream()
|
.stream()
|
||||||
.flatMap(Collection::stream)
|
.flatMap(Collection::stream)
|
||||||
.map(constructor);
|
.map(childConstructor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
return buildStringRepresentation();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildStringRepresentation() {
|
||||||
var builder = new StringBuilder();
|
var builder = new StringBuilder();
|
||||||
builder.append(getClass().getName()).append("[");
|
builder.append(getClass().getName()).append("[");
|
||||||
properties.forEach((key, value) -> builder.append("[").append(key).append(" : ").append(value)
|
|
||||||
.append("]"));
|
// Explaining variable for document properties map
|
||||||
|
Map<String, Object> documentProperties = this.documentProperties;
|
||||||
|
|
||||||
|
// Explaining variable for the size of document properties map
|
||||||
|
int numProperties = documentProperties.size();
|
||||||
|
|
||||||
|
// Explaining variable for tracking the current property index
|
||||||
|
int currentPropertyIndex = 0;
|
||||||
|
|
||||||
|
// Iterate over document properties map
|
||||||
|
for (Map.Entry<String, Object> entry : documentProperties.entrySet()) {
|
||||||
|
String key = entry.getKey();
|
||||||
|
Object value = entry.getValue();
|
||||||
|
|
||||||
|
// Append key-value pair
|
||||||
|
builder.append("[").append(key).append(" : ").append(value).append("]");
|
||||||
|
|
||||||
|
// Add comma if not last property
|
||||||
|
if (++currentPropertyIndex < numProperties) {
|
||||||
|
builder.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
builder.append("]");
|
builder.append("]");
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -49,20 +49,26 @@ public class App {
|
|||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
LOGGER.info("Constructing parts and car");
|
LOGGER.info("Constructing parts and car");
|
||||||
|
|
||||||
var wheelProperties = Map.of(
|
var wheelProperties =
|
||||||
|
Map.of(
|
||||||
Property.TYPE.toString(), "wheel",
|
Property.TYPE.toString(), "wheel",
|
||||||
Property.MODEL.toString(), "15C",
|
Property.MODEL.toString(), "15C",
|
||||||
Property.PRICE.toString(), 100L);
|
Property.PRICE.toString(), 100L);
|
||||||
|
|
||||||
var doorProperties = Map.of(
|
var doorProperties =
|
||||||
|
Map.of(
|
||||||
Property.TYPE.toString(), "door",
|
Property.TYPE.toString(), "door",
|
||||||
Property.MODEL.toString(), "Lambo",
|
Property.MODEL.toString(), "Lambo",
|
||||||
Property.PRICE.toString(), 300L);
|
Property.PRICE.toString(), 300L);
|
||||||
|
|
||||||
var carProperties = Map.of(
|
var carProperties =
|
||||||
Property.MODEL.toString(), "300SL",
|
Map.of(
|
||||||
Property.PRICE.toString(), 10000L,
|
Property.MODEL.toString(),
|
||||||
Property.PARTS.toString(), List.of(wheelProperties, doorProperties));
|
"300SL",
|
||||||
|
Property.PRICE.toString(),
|
||||||
|
10000L,
|
||||||
|
Property.PARTS.toString(),
|
||||||
|
List.of(wheelProperties, doorProperties));
|
||||||
|
|
||||||
var car = new Car(carProperties);
|
var car = new Car(carProperties);
|
||||||
|
|
||||||
@@ -70,10 +76,13 @@ public class App {
|
|||||||
LOGGER.info("-> model: {}", car.getModel().orElseThrow());
|
LOGGER.info("-> model: {}", car.getModel().orElseThrow());
|
||||||
LOGGER.info("-> price: {}", car.getPrice().orElseThrow());
|
LOGGER.info("-> price: {}", car.getPrice().orElseThrow());
|
||||||
LOGGER.info("-> parts: ");
|
LOGGER.info("-> parts: ");
|
||||||
car.getParts().forEach(p -> LOGGER.info("\t{}/{}/{}",
|
car.getParts()
|
||||||
|
.forEach(
|
||||||
|
p ->
|
||||||
|
LOGGER.info(
|
||||||
|
"\t{}/{}/{}",
|
||||||
p.getType().orElse(null),
|
p.getType().orElse(null),
|
||||||
p.getModel().orElse(null),
|
p.getModel().orElse(null),
|
||||||
p.getPrice().orElse(null))
|
p.getPrice().orElse(null)));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -28,9 +28,7 @@ import java.util.Map;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/** Document interface. */
|
||||||
* Document interface.
|
|
||||||
*/
|
|
||||||
public interface Document {
|
public interface Document {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -27,13 +27,10 @@ package com.iluwatar.abstractdocument.domain;
|
|||||||
import com.iluwatar.abstractdocument.AbstractDocument;
|
import com.iluwatar.abstractdocument.AbstractDocument;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/** Car entity. */
|
||||||
* Car entity.
|
|
||||||
*/
|
|
||||||
public class Car extends AbstractDocument implements HasModel, HasPrice, HasParts {
|
public class Car extends AbstractDocument implements HasModel, HasPrice, HasParts {
|
||||||
|
|
||||||
public Car(Map<String, Object> properties) {
|
public Car(Map<String, Object> properties) {
|
||||||
super(properties);
|
super(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -28,13 +28,10 @@ import com.iluwatar.abstractdocument.Document;
|
|||||||
import com.iluwatar.abstractdocument.domain.enums.Property;
|
import com.iluwatar.abstractdocument.domain.enums.Property;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/** HasModel trait for static access to 'model' property. */
|
||||||
* HasModel trait for static access to 'model' property.
|
|
||||||
*/
|
|
||||||
public interface HasModel extends Document {
|
public interface HasModel extends Document {
|
||||||
|
|
||||||
default Optional<String> getModel() {
|
default Optional<String> getModel() {
|
||||||
return Optional.ofNullable((String) get(Property.MODEL.toString()));
|
return Optional.ofNullable((String) get(Property.MODEL.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -28,13 +28,10 @@ import com.iluwatar.abstractdocument.Document;
|
|||||||
import com.iluwatar.abstractdocument.domain.enums.Property;
|
import com.iluwatar.abstractdocument.domain.enums.Property;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
/**
|
/** HasParts trait for static access to 'parts' property. */
|
||||||
* HasParts trait for static access to 'parts' property.
|
|
||||||
*/
|
|
||||||
public interface HasParts extends Document {
|
public interface HasParts extends Document {
|
||||||
|
|
||||||
default Stream<Part> getParts() {
|
default Stream<Part> getParts() {
|
||||||
return children(Property.PARTS.toString(), Part::new);
|
return children(Property.PARTS.toString(), Part::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -28,13 +28,10 @@ import com.iluwatar.abstractdocument.Document;
|
|||||||
import com.iluwatar.abstractdocument.domain.enums.Property;
|
import com.iluwatar.abstractdocument.domain.enums.Property;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/** HasPrice trait for static access to 'price' property. */
|
||||||
* HasPrice trait for static access to 'price' property.
|
|
||||||
*/
|
|
||||||
public interface HasPrice extends Document {
|
public interface HasPrice extends Document {
|
||||||
|
|
||||||
default Optional<Number> getPrice() {
|
default Optional<Number> getPrice() {
|
||||||
return Optional.ofNullable((Number) get(Property.PRICE.toString()));
|
return Optional.ofNullable((Number) get(Property.PRICE.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -28,13 +28,10 @@ import com.iluwatar.abstractdocument.Document;
|
|||||||
import com.iluwatar.abstractdocument.domain.enums.Property;
|
import com.iluwatar.abstractdocument.domain.enums.Property;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/** HasType trait for static access to 'type' property. */
|
||||||
* HasType trait for static access to 'type' property.
|
|
||||||
*/
|
|
||||||
public interface HasType extends Document {
|
public interface HasType extends Document {
|
||||||
|
|
||||||
default Optional<String> getType() {
|
default Optional<String> getType() {
|
||||||
return Optional.ofNullable((String) get(Property.TYPE.toString()));
|
return Optional.ofNullable((String) get(Property.TYPE.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -27,13 +27,10 @@ package com.iluwatar.abstractdocument.domain;
|
|||||||
import com.iluwatar.abstractdocument.AbstractDocument;
|
import com.iluwatar.abstractdocument.AbstractDocument;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/** Part entity. */
|
||||||
* Part entity.
|
|
||||||
*/
|
|
||||||
public class Part extends AbstractDocument implements HasType, HasModel, HasPrice {
|
public class Part extends AbstractDocument implements HasType, HasModel, HasPrice {
|
||||||
|
|
||||||
public Part(Map<String, Object> properties) {
|
public Part(Map<String, Object> properties) {
|
||||||
super(properties);
|
super(properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+5
-5
@@ -24,10 +24,10 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractdocument.domain.enums;
|
package com.iluwatar.abstractdocument.domain.enums;
|
||||||
|
|
||||||
/**
|
/** Enum To Describe Property type. */
|
||||||
* Enum To Describe Property type.
|
|
||||||
*/
|
|
||||||
public enum Property {
|
public enum Property {
|
||||||
|
PARTS,
|
||||||
PARTS, TYPE, PRICE, MODEL
|
TYPE,
|
||||||
|
PRICE,
|
||||||
|
MODEL
|
||||||
}
|
}
|
||||||
+53
-6
@@ -24,16 +24,14 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractdocument;
|
package com.iluwatar.abstractdocument;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
/** AbstractDocument test class */
|
||||||
|
|
||||||
/**
|
|
||||||
* AbstractDocument test class
|
|
||||||
*/
|
|
||||||
class AbstractDocumentTest {
|
class AbstractDocumentTest {
|
||||||
|
|
||||||
private static final String KEY = "key";
|
private static final String KEY = "key";
|
||||||
@@ -80,4 +78,53 @@ class AbstractDocumentTest {
|
|||||||
assertTrue(document.toString().contains(VALUE));
|
assertTrue(document.toString().contains(VALUE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldHandleExceptionDuringConstruction() {
|
||||||
|
Map<String, Object> invalidProperties =
|
||||||
|
null; // Invalid properties, causing NullPointerException
|
||||||
|
|
||||||
|
// Throw null pointer exception
|
||||||
|
assertThrows(
|
||||||
|
NullPointerException.class,
|
||||||
|
() -> {
|
||||||
|
// Attempt to construct a document with invalid properties
|
||||||
|
new DocumentImplementation(invalidProperties);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldPutAndGetNestedDocument() {
|
||||||
|
// Creating a nested document
|
||||||
|
DocumentImplementation nestedDocument = new DocumentImplementation(new HashMap<>());
|
||||||
|
nestedDocument.put("nestedKey", "nestedValue");
|
||||||
|
|
||||||
|
document.put("nested", nestedDocument);
|
||||||
|
|
||||||
|
// Retrieving the nested document
|
||||||
|
DocumentImplementation retrievedNestedDocument =
|
||||||
|
(DocumentImplementation) document.get("nested");
|
||||||
|
|
||||||
|
assertNotNull(retrievedNestedDocument);
|
||||||
|
assertEquals("nestedValue", retrievedNestedDocument.get("nestedKey"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldUpdateExistingValue() {
|
||||||
|
// Arrange
|
||||||
|
final String key = "key";
|
||||||
|
final String originalValue = "originalValue";
|
||||||
|
final String updatedValue = "updatedValue";
|
||||||
|
|
||||||
|
// Initializing the value
|
||||||
|
document.put(key, originalValue);
|
||||||
|
|
||||||
|
// Verifying that the initial value is retrieved correctly
|
||||||
|
assertEquals(originalValue, document.get(key));
|
||||||
|
|
||||||
|
// Updating the value
|
||||||
|
document.put(key, updatedValue);
|
||||||
|
|
||||||
|
// Verifying that the updated value is retrieved correctly
|
||||||
|
assertEquals(updatedValue, document.get(key));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -24,25 +24,21 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractdocument;
|
package com.iluwatar.abstractdocument;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||||
|
|
||||||
/**
|
import org.junit.jupiter.api.Test;
|
||||||
* Simple App test
|
|
||||||
*/
|
/** Simple App test */
|
||||||
class AppTest {
|
class AppTest {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Issue: Add at least one assertion to this test case.
|
* Issue: Add at least one assertion to this test case.
|
||||||
*
|
*
|
||||||
* Solution: Inserted assertion to check whether the execution of the main method in {@link App}
|
* <p>Solution: Inserted assertion to check whether the execution of the main method in {@link
|
||||||
* throws an exception.
|
* App} throws an exception.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldExecuteAppWithoutException() {
|
void shouldExecuteAppWithoutException() {
|
||||||
assertDoesNotThrow(() -> App.main(null));
|
assertDoesNotThrow(() -> App.main(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -24,18 +24,16 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractdocument;
|
package com.iluwatar.abstractdocument;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import com.iluwatar.abstractdocument.domain.Car;
|
import com.iluwatar.abstractdocument.domain.Car;
|
||||||
import com.iluwatar.abstractdocument.domain.Part;
|
import com.iluwatar.abstractdocument.domain.Part;
|
||||||
import com.iluwatar.abstractdocument.domain.enums.Property;
|
import com.iluwatar.abstractdocument.domain.enums.Property;
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
/** Test for Part and Car */
|
||||||
|
|
||||||
/**
|
|
||||||
* Test for Part and Car
|
|
||||||
*/
|
|
||||||
class DomainTest {
|
class DomainTest {
|
||||||
|
|
||||||
private static final String TEST_PART_TYPE = "test-part-type";
|
private static final String TEST_PART_TYPE = "test-part-type";
|
||||||
@@ -47,11 +45,11 @@ class DomainTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldConstructPart() {
|
void shouldConstructPart() {
|
||||||
var partProperties = Map.of(
|
var partProperties =
|
||||||
|
Map.of(
|
||||||
Property.TYPE.toString(), TEST_PART_TYPE,
|
Property.TYPE.toString(), TEST_PART_TYPE,
|
||||||
Property.MODEL.toString(), TEST_PART_MODEL,
|
Property.MODEL.toString(), TEST_PART_MODEL,
|
||||||
Property.PRICE.toString(), (Object) TEST_PART_PRICE
|
Property.PRICE.toString(), (Object) TEST_PART_PRICE);
|
||||||
);
|
|
||||||
var part = new Part(partProperties);
|
var part = new Part(partProperties);
|
||||||
assertEquals(TEST_PART_TYPE, part.getType().orElseThrow());
|
assertEquals(TEST_PART_TYPE, part.getType().orElseThrow());
|
||||||
assertEquals(TEST_PART_MODEL, part.getModel().orElseThrow());
|
assertEquals(TEST_PART_MODEL, part.getModel().orElseThrow());
|
||||||
@@ -60,15 +58,14 @@ class DomainTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldConstructCar() {
|
void shouldConstructCar() {
|
||||||
var carProperties = Map.of(
|
var carProperties =
|
||||||
|
Map.of(
|
||||||
Property.MODEL.toString(), TEST_CAR_MODEL,
|
Property.MODEL.toString(), TEST_CAR_MODEL,
|
||||||
Property.PRICE.toString(), TEST_CAR_PRICE,
|
Property.PRICE.toString(), TEST_CAR_PRICE,
|
||||||
Property.PARTS.toString(), List.of(Map.of(), Map.of())
|
Property.PARTS.toString(), List.of(Map.of(), Map.of()));
|
||||||
);
|
|
||||||
var car = new Car(carProperties);
|
var car = new Car(carProperties);
|
||||||
assertEquals(TEST_CAR_MODEL, car.getModel().orElseThrow());
|
assertEquals(TEST_CAR_MODEL, car.getModel().orElseThrow());
|
||||||
assertEquals(TEST_CAR_PRICE, car.getPrice().orElseThrow());
|
assertEquals(TEST_CAR_PRICE, car.getPrice().orElseThrow());
|
||||||
assertEquals(2, car.getParts().count());
|
assertEquals(2, car.getParts().count());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+96
-98
@@ -1,25 +1,32 @@
|
|||||||
---
|
---
|
||||||
title: Abstract Factory
|
title: "Abstract Factory Pattern in Java: Mastering Object Creation Elegantly"
|
||||||
|
shortTitle: Abstract Factory
|
||||||
|
description: "Learn the Abstract Factory pattern in Java with real-world examples, class diagrams, and tutorials. Understand its intent, applicability, benefits, and known uses to enhance your design pattern knowledge."
|
||||||
category: Creational
|
category: Creational
|
||||||
language: en
|
language: en
|
||||||
tag:
|
tag:
|
||||||
|
- Abstraction
|
||||||
|
- Decoupling
|
||||||
- Gang of Four
|
- Gang of Four
|
||||||
|
- Instantiation
|
||||||
|
- Polymorphism
|
||||||
---
|
---
|
||||||
|
|
||||||
## Also known as
|
## Also known as
|
||||||
|
|
||||||
Kit
|
* Kit
|
||||||
|
|
||||||
## Intent
|
## Intent of Abstract Factory Design Pattern
|
||||||
|
|
||||||
Provide an interface for creating families of related or dependent
|
The Abstract Factory pattern in Java provides an interface for creating families of related or dependent objects without specifying their concrete classes, enhancing modularity and flexibility in software design.
|
||||||
objects without specifying their concrete classes.
|
|
||||||
|
|
||||||
## Explanation
|
## Detailed Explanation of Abstract Factory Pattern with Real-World Examples
|
||||||
|
|
||||||
Real-world example
|
Real-world example
|
||||||
|
|
||||||
> To create a kingdom we need objects with a common theme. The elven kingdom needs an elven king, elven castle, and elven army whereas the orcish kingdom needs an orcish king, orcish castle, and orcish army. There is a dependency between the objects in the kingdom.
|
> Imagine a furniture company that uses the Abstract Factory pattern in Java to produce various styles of furniture: modern, Victorian, and rustic. Each style includes products like chairs, tables, and sofas. To ensure consistency within each style, the company uses an Abstract Factory pattern.
|
||||||
|
>
|
||||||
|
> In this scenario, the Abstract Factory is an interface for creating families of related furniture objects (chairs, tables, sofas). Each concrete factory (ModernFurnitureFactory, VictorianFurnitureFactory, RusticFurnitureFactory) implements the Abstract Factory interface and creates a set of products that match the specific style. This way, clients can create a whole set of modern or Victorian furniture without worrying about the details of their instantiation. This maintains a consistent style and allows easy swapping of one style of furniture for another.
|
||||||
|
|
||||||
In plain words
|
In plain words
|
||||||
|
|
||||||
@@ -29,10 +36,15 @@ Wikipedia says
|
|||||||
|
|
||||||
> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes
|
> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes
|
||||||
|
|
||||||
**Programmatic Example**
|
Class diagram
|
||||||
|
|
||||||
Translating the kingdom example above. First of all, we have some interfaces and implementation for the objects in the
|

|
||||||
kingdom.
|
|
||||||
|
## Programmatic Example of Abstract Factory in Java
|
||||||
|
|
||||||
|
To create a kingdom using the Abstract Factory pattern in Java, we need objects with a common theme. The elven kingdom needs an elven king, elven castle, and elven army whereas the orcish kingdom needs an orcish king, orcish castle, and orcish army. There is a dependency between the objects in the kingdom.
|
||||||
|
|
||||||
|
Translating the kingdom example above. First of all, we have some interfaces and implementation for the objects in the kingdom.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public interface Castle {
|
public interface Castle {
|
||||||
@@ -50,20 +62,25 @@ public interface Army {
|
|||||||
// Elven implementations ->
|
// Elven implementations ->
|
||||||
public class ElfCastle implements Castle {
|
public class ElfCastle implements Castle {
|
||||||
static final String DESCRIPTION = "This is the elven castle!";
|
static final String DESCRIPTION = "This is the elven castle!";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
return DESCRIPTION;
|
return DESCRIPTION;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ElfKing implements King {
|
public class ElfKing implements King {
|
||||||
static final String DESCRIPTION = "This is the elven king!";
|
static final String DESCRIPTION = "This is the elven king!";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
return DESCRIPTION;
|
return DESCRIPTION;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ElfArmy implements Army {
|
public class ElfArmy implements Army {
|
||||||
static final String DESCRIPTION = "This is the elven Army!";
|
static final String DESCRIPTION = "This is the elven Army!";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
return DESCRIPTION;
|
return DESCRIPTION;
|
||||||
@@ -71,7 +88,6 @@ public class ElfArmy implements Army {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Orcish implementations similarly -> ...
|
// Orcish implementations similarly -> ...
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Then we have the abstraction and implementations for the kingdom factory.
|
Then we have the abstraction and implementations for the kingdom factory.
|
||||||
@@ -79,7 +95,9 @@ Then we have the abstraction and implementations for the kingdom factory.
|
|||||||
```java
|
```java
|
||||||
public interface KingdomFactory {
|
public interface KingdomFactory {
|
||||||
Castle createCastle();
|
Castle createCastle();
|
||||||
|
|
||||||
King createKing();
|
King createKing();
|
||||||
|
|
||||||
Army createArmy();
|
Army createArmy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,49 +119,10 @@ public class ElfKingdomFactory implements KingdomFactory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class OrcKingdomFactory implements KingdomFactory {
|
// Orcish implementations similarly -> ...
|
||||||
|
|
||||||
@Override
|
|
||||||
public Castle createCastle() {
|
|
||||||
return new OrcCastle();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public King createKing() {
|
|
||||||
return new OrcKing();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Army createArmy() {
|
|
||||||
return new OrcArmy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Now we have the abstract factory that lets us make a family of related objects i.e. elven kingdom factory creates elven castle, king and army, etc.
|
Now, we can design a factory for our different kingdom factories. In this example, we created `FactoryMaker`, responsible for returning an instance of either `ElfKingdomFactory` or `OrcKingdomFactory`. The client can use `FactoryMaker` to create the desired concrete factory which, in turn, will produce different concrete objects (derived from `Army`, `King`, `Castle`). In this example, we also used an enum to parameterize which type of kingdom factory the client will ask for.
|
||||||
|
|
||||||
```java
|
|
||||||
var factory = new ElfKingdomFactory();
|
|
||||||
var castle = factory.createCastle();
|
|
||||||
var king = factory.createKing();
|
|
||||||
var army = factory.createArmy();
|
|
||||||
|
|
||||||
castle.getDescription();
|
|
||||||
king.getDescription();
|
|
||||||
army.getDescription();
|
|
||||||
```
|
|
||||||
|
|
||||||
Program output:
|
|
||||||
|
|
||||||
```java
|
|
||||||
This is the elven castle!
|
|
||||||
This is the elven king!
|
|
||||||
This is the elven Army!
|
|
||||||
```
|
|
||||||
|
|
||||||
Now, we can design a factory for our different kingdom factories. In this example, we created `FactoryMaker`, responsible for returning an instance of either `ElfKingdomFactory` or `OrcKingdomFactory`.
|
|
||||||
The client can use `FactoryMaker` to create the desired concrete factory which, in turn, will produce different concrete objects (derived from `Army`, `King`, `Castle`).
|
|
||||||
In this example, we also used an enum to parameterize which type of kingdom factory the client will ask for.
|
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public static class FactoryMaker {
|
public static class FactoryMaker {
|
||||||
@@ -156,74 +135,93 @@ public static class FactoryMaker {
|
|||||||
return switch (type) {
|
return switch (type) {
|
||||||
case ELF -> new ElfKingdomFactory();
|
case ELF -> new ElfKingdomFactory();
|
||||||
case ORC -> new OrcKingdomFactory();
|
case ORC -> new OrcKingdomFactory();
|
||||||
default -> throw new IllegalArgumentException("KingdomType not supported.");
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
var app = new App();
|
|
||||||
|
|
||||||
LOGGER.info("Elf Kingdom");
|
|
||||||
app.createKingdom(FactoryMaker.makeFactory(KingdomType.ELF));
|
|
||||||
LOGGER.info(app.getArmy().getDescription());
|
|
||||||
LOGGER.info(app.getCastle().getDescription());
|
|
||||||
LOGGER.info(app.getKing().getDescription());
|
|
||||||
|
|
||||||
LOGGER.info("Orc Kingdom");
|
|
||||||
app.createKingdom(FactoryMaker.makeFactory(KingdomType.ORC));
|
|
||||||
--similar use of the orc factory
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Class diagram
|
Here is the main function of our example application:
|
||||||
|
|
||||||

|
```java
|
||||||
|
LOGGER.info("elf kingdom");
|
||||||
|
createKingdom(Kingdom.FactoryMaker.KingdomType.ELF);
|
||||||
|
LOGGER.info(kingdom.getArmy().getDescription());
|
||||||
|
LOGGER.info(kingdom.getCastle().getDescription());
|
||||||
|
LOGGER.info(kingdom.getKing().getDescription());
|
||||||
|
|
||||||
|
LOGGER.info("orc kingdom");
|
||||||
|
createKingdom(Kingdom.FactoryMaker.KingdomType.ORC);
|
||||||
|
LOGGER.info(kingdom.getArmy().getDescription());
|
||||||
|
LOGGER.info(kingdom.getCastle().getDescription());
|
||||||
|
LOGGER.info(kingdom.getKing().getDescription());
|
||||||
|
```
|
||||||
|
|
||||||
## Applicability
|
The program output:
|
||||||
|
|
||||||
Use the Abstract Factory pattern when
|
```
|
||||||
|
07:35:46.340 [main] INFO com.iluwatar.abstractfactory.App -- elf kingdom
|
||||||
|
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the elven army!
|
||||||
|
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the elven castle!
|
||||||
|
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the elven king!
|
||||||
|
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- orc kingdom
|
||||||
|
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the orc army!
|
||||||
|
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the orc castle!
|
||||||
|
07:35:46.343 [main] INFO com.iluwatar.abstractfactory.App -- This is the orc king!
|
||||||
|
```
|
||||||
|
|
||||||
* The system should be independent of how its products are created, composed, and represented
|
## When to Use the Abstract Factory Pattern in Java
|
||||||
* The system should be configured with one of the multiple families of products
|
|
||||||
* The family of related product objects is designed to be used together, and you need to enforce this constraint
|
|
||||||
* You want to provide a class library of products, and you want to reveal just their interfaces, not their implementations
|
|
||||||
* The lifetime of the dependency is conceptually shorter than the lifetime of the consumer.
|
|
||||||
* You need a run-time value to construct a particular dependency
|
|
||||||
* You want to decide which product to call from a family at runtime.
|
|
||||||
* You need to supply one or more parameters only known at run-time before you can resolve a dependency.
|
|
||||||
* When you need consistency among products
|
|
||||||
* You don’t want to change existing code when adding new products or families of products to the program.
|
|
||||||
|
|
||||||
Example use cases
|
Use the Abstract Factory pattern in Java when:
|
||||||
|
|
||||||
* Selecting to call to the appropriate implementation of FileSystemAcmeService or DatabaseAcmeService or NetworkAcmeService at runtime.
|
* The system should be independent of how its products are created, composed, and represented.
|
||||||
* Unit test case writing becomes much easier
|
* You need to configure the system with one of multiple families of products.
|
||||||
* UI tools for different OS
|
* A family of related product objects must be used together, enforcing consistency.
|
||||||
|
* You want to provide a class library of products, exposing only their interfaces, not their implementations.
|
||||||
|
* The lifetime of dependencies is shorter than the consumer's lifetime.
|
||||||
|
* Dependencies need to be constructed using runtime values or parameters.
|
||||||
|
* You need to choose which product to use from a family at runtime.
|
||||||
|
* Adding new products or families should not require changes to existing code.
|
||||||
|
|
||||||
## Consequences
|
## Abstract Factory Pattern Java Tutorials
|
||||||
|
|
||||||
* Dependency injection in java hides the service class dependencies that can lead to runtime errors that would have been caught at compile time.
|
* [Abstract Factory Design Pattern in Java (DigitalOcean)](https://www.digitalocean.com/community/tutorials/abstract-factory-design-pattern-in-java)
|
||||||
* While the pattern is great when creating predefined objects, adding the new ones might be challenging.
|
* [Abstract Factory(Refactoring Guru)](https://refactoring.guru/design-patterns/abstract-factory)
|
||||||
* The code becomes more complicated than it should be since a lot of new interfaces and classes are introduced along with the pattern.
|
|
||||||
|
|
||||||
## Tutorials
|
## Benefits and Trade-offs of Abstract Factory Pattern
|
||||||
|
|
||||||
* [Abstract Factory Pattern Tutorial](https://www.journaldev.com/1418/abstract-factory-design-pattern-in-java)
|
Benefits:
|
||||||
|
|
||||||
## Known uses
|
* Flexibility: Easily switch between product families without code modifications.
|
||||||
|
|
||||||
|
* Decoupling: Client code only interacts with abstract interfaces, promoting portability and maintainability.
|
||||||
|
|
||||||
|
* Reusability: Abstract factories and products facilitate component reuse across projects.
|
||||||
|
|
||||||
|
* Maintainability: Changes to individual product families are localized, simplifying updates.
|
||||||
|
|
||||||
|
Trade-offs:
|
||||||
|
|
||||||
|
* Complexity: Defining abstract interfaces and concrete factories adds initial overhead.
|
||||||
|
|
||||||
|
* Indirectness: Client code interacts with products indirectly through factories, potentially reducing transparency.
|
||||||
|
|
||||||
|
## Real-World Applications of Abstract Factory Pattern in Java
|
||||||
|
|
||||||
|
* Java Swing's `LookAndFeel` classes for providing different look-and-feel options.
|
||||||
|
* Various implementations in the Java Abstract Window Toolkit (AWT) for creating different GUI components.
|
||||||
* [javax.xml.parsers.DocumentBuilderFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html)
|
* [javax.xml.parsers.DocumentBuilderFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html)
|
||||||
* [javax.xml.transform.TransformerFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newInstance--)
|
* [javax.xml.transform.TransformerFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newInstance--)
|
||||||
* [javax.xml.xpath.XPathFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathFactory.html#newInstance--)
|
* [javax.xml.xpath.XPathFactory](http://docs.oracle.com/javase/8/docs/api/javax/xml/xpath/XPathFactory.html#newInstance--)
|
||||||
|
|
||||||
## Related patterns
|
## Related Java Design Patterns
|
||||||
|
|
||||||
* [Factory Method](https://java-design-patterns.com/patterns/factory-method/)
|
* [Factory Method](https://java-design-patterns.com/patterns/factory-method/): Abstract Factory uses Factory Methods to create products.
|
||||||
* [Factory Kit](https://java-design-patterns.com/patterns/factory-kit/)
|
* [Singleton](https://java-design-patterns.com/patterns/singleton/): Abstract Factory classes are often implemented as Singletons.
|
||||||
|
* [Factory Kit](https://java-design-patterns.com/patterns/factory-kit/): Similar to Abstract Factory but focuses on configuring and managing a set of related objects in a flexible way.
|
||||||
|
|
||||||
## Credits
|
## References and Credits
|
||||||
|
|
||||||
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59)
|
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI)
|
||||||
* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b)
|
* [Design Patterns in Java](https://amzn.to/3Syw0vC)
|
||||||
|
* [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/49NGldq)
|
||||||
|
* [Java Design Patterns: A Hands-On Experience with Real-World Examples](https://amzn.to/3HWNf4U)
|
||||||
@@ -34,6 +34,14 @@
|
|||||||
</parent>
|
</parent>
|
||||||
<artifactId>abstract-factory</artifactId>
|
<artifactId>abstract-factory</artifactId>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter-engine</artifactId>
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -41,14 +42,11 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
* both concrete implementations to create a king, a castle, and an army.
|
* both concrete implementations to create a king, a castle, and an army.
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@Getter
|
||||||
public class App implements Runnable {
|
public class App implements Runnable {
|
||||||
|
|
||||||
private final Kingdom kingdom = new Kingdom();
|
private final Kingdom kingdom = new Kingdom();
|
||||||
|
|
||||||
public Kingdom getKingdom() {
|
|
||||||
return kingdom;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Program entry point.
|
* Program entry point.
|
||||||
*
|
*
|
||||||
@@ -76,6 +74,7 @@ public class App implements Runnable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates kingdom.
|
* Creates kingdom.
|
||||||
|
*
|
||||||
* @param kingdomType type of Kingdom
|
* @param kingdomType type of Kingdom
|
||||||
*/
|
*/
|
||||||
public void createKingdom(final Kingdom.FactoryMaker.KingdomType kingdomType) {
|
public void createKingdom(final Kingdom.FactoryMaker.KingdomType kingdomType) {
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** Army interface. */
|
||||||
* Army interface.
|
|
||||||
*/
|
|
||||||
public interface Army {
|
public interface Army {
|
||||||
|
|
||||||
String getDescription();
|
String getDescription();
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** Castle interface. */
|
||||||
* Castle interface.
|
|
||||||
*/
|
|
||||||
public interface Castle {
|
public interface Castle {
|
||||||
|
|
||||||
String getDescription();
|
String getDescription();
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** ElfArmy. */
|
||||||
* ElfArmy.
|
|
||||||
*/
|
|
||||||
public class ElfArmy implements Army {
|
public class ElfArmy implements Army {
|
||||||
|
|
||||||
static final String DESCRIPTION = "This is the elven army!";
|
static final String DESCRIPTION = "This is the elven army!";
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** ElfCastle. */
|
||||||
* ElfCastle.
|
|
||||||
*/
|
|
||||||
public class ElfCastle implements Castle {
|
public class ElfCastle implements Castle {
|
||||||
|
|
||||||
static final String DESCRIPTION = "This is the elven castle!";
|
static final String DESCRIPTION = "This is the elven castle!";
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** ElfKing. */
|
||||||
* ElfKing.
|
|
||||||
*/
|
|
||||||
public class ElfKing implements King {
|
public class ElfKing implements King {
|
||||||
|
|
||||||
static final String DESCRIPTION = "This is the elven king!";
|
static final String DESCRIPTION = "This is the elven king!";
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** ElfKingdomFactory concrete factory. */
|
||||||
* ElfKingdomFactory concrete factory.
|
|
||||||
*/
|
|
||||||
public class ElfKingdomFactory implements KingdomFactory {
|
public class ElfKingdomFactory implements KingdomFactory {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -43,5 +41,4 @@ public class ElfKingdomFactory implements KingdomFactory {
|
|||||||
public Army createArmy() {
|
public Army createArmy() {
|
||||||
return new ElfArmy();
|
return new ElfArmy();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** King interface. */
|
||||||
* King interface.
|
|
||||||
*/
|
|
||||||
public interface King {
|
public interface King {
|
||||||
|
|
||||||
String getDescription();
|
String getDescription();
|
||||||
|
|||||||
@@ -27,9 +27,7 @@ package com.iluwatar.abstractfactory;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
/**
|
/** Helper class to manufacture {@link KingdomFactory} beans. */
|
||||||
* Helper class to manufacture {@link KingdomFactory} beans.
|
|
||||||
*/
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class Kingdom {
|
public class Kingdom {
|
||||||
@@ -38,26 +36,20 @@ public class Kingdom {
|
|||||||
private Castle castle;
|
private Castle castle;
|
||||||
private Army army;
|
private Army army;
|
||||||
|
|
||||||
/**
|
/** The factory of kingdom factories. */
|
||||||
* The factory of kingdom factories.
|
|
||||||
*/
|
|
||||||
public static class FactoryMaker {
|
public static class FactoryMaker {
|
||||||
|
|
||||||
/**
|
/** Enumeration for the different types of Kingdoms. */
|
||||||
* Enumeration for the different types of Kingdoms.
|
|
||||||
*/
|
|
||||||
public enum KingdomType {
|
public enum KingdomType {
|
||||||
ELF, ORC
|
ELF,
|
||||||
|
ORC
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** The factory method to create KingdomFactory concrete objects. */
|
||||||
* The factory method to create KingdomFactory concrete objects.
|
|
||||||
*/
|
|
||||||
public static KingdomFactory makeFactory(KingdomType type) {
|
public static KingdomFactory makeFactory(KingdomType type) {
|
||||||
return switch (type) {
|
return switch (type) {
|
||||||
case ELF -> new ElfKingdomFactory();
|
case ELF -> new ElfKingdomFactory();
|
||||||
case ORC -> new OrcKingdomFactory();
|
case ORC -> new OrcKingdomFactory();
|
||||||
default -> throw new IllegalArgumentException("KingdomType not supported.");
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** KingdomFactory factory interface. */
|
||||||
* KingdomFactory factory interface.
|
|
||||||
*/
|
|
||||||
public interface KingdomFactory {
|
public interface KingdomFactory {
|
||||||
|
|
||||||
Castle createCastle();
|
Castle createCastle();
|
||||||
@@ -34,5 +32,4 @@ public interface KingdomFactory {
|
|||||||
King createKing();
|
King createKing();
|
||||||
|
|
||||||
Army createArmy();
|
Army createArmy();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** OrcArmy. */
|
||||||
* OrcArmy.
|
|
||||||
*/
|
|
||||||
public class OrcArmy implements Army {
|
public class OrcArmy implements Army {
|
||||||
|
|
||||||
static final String DESCRIPTION = "This is the orc army!";
|
static final String DESCRIPTION = "This is the orc army!";
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** OrcCastle. */
|
||||||
* OrcCastle.
|
|
||||||
*/
|
|
||||||
public class OrcCastle implements Castle {
|
public class OrcCastle implements Castle {
|
||||||
|
|
||||||
static final String DESCRIPTION = "This is the orc castle!";
|
static final String DESCRIPTION = "This is the orc castle!";
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** OrcKing. */
|
||||||
* OrcKing.
|
|
||||||
*/
|
|
||||||
public class OrcKing implements King {
|
public class OrcKing implements King {
|
||||||
|
|
||||||
static final String DESCRIPTION = "This is the orc king!";
|
static final String DESCRIPTION = "This is the orc king!";
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
/**
|
/** OrcKingdomFactory concrete factory. */
|
||||||
* OrcKingdomFactory concrete factory.
|
|
||||||
*/
|
|
||||||
public class OrcKingdomFactory implements KingdomFactory {
|
public class OrcKingdomFactory implements KingdomFactory {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+3
-5
@@ -24,14 +24,12 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
/**
|
import org.junit.jupiter.api.Test;
|
||||||
* Tests for abstract factory.
|
|
||||||
*/
|
/** Tests for abstract factory. */
|
||||||
class AbstractFactoryTest {
|
class AbstractFactoryTest {
|
||||||
|
|
||||||
private final App app = new App();
|
private final App app = new App();
|
||||||
|
|||||||
@@ -24,18 +24,16 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.abstractfactory;
|
package com.iluwatar.abstractfactory;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||||
|
|
||||||
/**
|
import org.junit.jupiter.api.Test;
|
||||||
* Check whether the execution of the main method in {@link App} throws an exception.
|
|
||||||
*/
|
/** Check whether the execution of the main method in {@link App} throws an exception. */
|
||||||
class AppTest {
|
class AppTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldExecuteApplicationWithoutException() {
|
void shouldExecuteApplicationWithoutException() {
|
||||||
|
|
||||||
assertDoesNotThrow(() -> App.main(new String[]{}));
|
assertDoesNotThrow(() -> App.main(new String[] {}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+123
-28
@@ -1,30 +1,59 @@
|
|||||||
---
|
---
|
||||||
title: Active Object
|
title: "Active Object Pattern in Java: Achieving Efficient Asynchronous Processing"
|
||||||
|
shortTitle: Active Object
|
||||||
|
description: "Learn about the Active Object design pattern in Java. This guide covers asynchronous behavior, concurrency, and practical examples to enhance your Java applications' performance."
|
||||||
category: Concurrency
|
category: Concurrency
|
||||||
language: en
|
language: en
|
||||||
tag:
|
tag:
|
||||||
- Performance
|
- Asynchronous
|
||||||
|
- Decoupling
|
||||||
|
- Messaging
|
||||||
|
- Synchronization
|
||||||
|
- Thread management
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Intent of Active Object Design Pattern
|
||||||
|
|
||||||
## Intent
|
The Active Object pattern provides a reliable method for asynchronous processing in Java, ensuring responsive applications and efficient thread management. It achieves this by encapsulating tasks within objects that have their own thread and message queue. This separation keeps the main thread responsive and avoids issues like direct thread manipulation or shared state access.
|
||||||
The active object design pattern decouples method execution from method invocation for objects that each reside in their thread of control. The goal is to introduce concurrency, by using asynchronous method invocation, and a scheduler for handling requests.
|
|
||||||
|
|
||||||
## Explanation
|
## Detailed Explanation of Active Object Pattern with Real-World Examples
|
||||||
|
|
||||||
The class that implements the active object pattern will contain a self-synchronization mechanism without using 'synchronized' methods.
|
|
||||||
|
|
||||||
Real-world example
|
Real-world example
|
||||||
|
|
||||||
>The Orcs are known for their wildness and untameable soul. It seems like they have their own thread of control based on previous behavior.
|
> Imagine a busy restaurant where customers place orders with waiters. Instead of the waiters going to the kitchen to prepare the food themselves, they write the orders on slips and hand them to a dispatcher. The dispatcher manages a pool of chefs who prepare the meals asynchronously. Once a chef is free, they pick up the next order from the queue, prepare the dish, and notify the waiter when it's ready for serving.
|
||||||
|
>
|
||||||
|
> In this analogy, the waiters represent the client threads, the dispatcher represents the scheduler, and the chefs represent the method execution in separate threads. This setup allows the waiters to continue taking orders without being blocked by the food preparation process, much like the Active Object pattern decouples method invocation from execution to enhance concurrency.
|
||||||
|
|
||||||
To implement a creature that has its own thread of control mechanism and expose its API only and not the execution itself, we can use the Active Object pattern.
|
In plain words
|
||||||
|
|
||||||
|
> The Active Object pattern decouples method execution from method invocation to improve concurrency and responsiveness in multithreaded applications.
|
||||||
|
|
||||||
|
Wikipedia says
|
||||||
|
|
||||||
|
> The active object design pattern decouples method execution from method invocation for objects that each reside in their own thread of control.[1] The goal is to introduce concurrency, by using asynchronous method invocation and a scheduler for handling requests.
|
||||||
|
>
|
||||||
|
> The pattern consists of six elements:
|
||||||
|
>
|
||||||
|
> * A proxy, which provides an interface towards clients with publicly accessible methods.
|
||||||
|
> * An interface which defines the method request on an active object.
|
||||||
|
> * A list of pending requests from clients.
|
||||||
|
> * A scheduler, which decides which request to execute next.
|
||||||
|
> * The implementation of the active object method.
|
||||||
|
> * A callback or variable for the client to receive the result.
|
||||||
|
|
||||||
|
Sequence diagram
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
**Programmatic Example**
|
## Programmatic Example of Active Object in Java
|
||||||
|
|
||||||
|
This section explains how the Active Object design pattern works in Java, highlighting its use in asynchronous task management and concurrency control.
|
||||||
|
|
||||||
|
The Orcs are known for their wildness and untameable soul. It seems like they have their own thread of control based on previous behavior. To implement a creature that has its own thread of control mechanism and expose its API only and not the execution itself, we can use the Active Object pattern.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public abstract class ActiveCreature{
|
public abstract class ActiveCreature {
|
||||||
private final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName());
|
private final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName());
|
||||||
|
|
||||||
private BlockingQueue<Runnable> requests;
|
private BlockingQueue<Runnable> requests;
|
||||||
@@ -56,8 +85,8 @@ public abstract class ActiveCreature{
|
|||||||
requests.put(new Runnable() {
|
requests.put(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
logger.info("{} is eating!",name());
|
logger.info("{} is eating!", name());
|
||||||
logger.info("{} has finished eating!",name());
|
logger.info("{} has finished eating!", name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -67,7 +96,7 @@ public abstract class ActiveCreature{
|
|||||||
requests.put(new Runnable() {
|
requests.put(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
logger.info("{} has started to roam the wastelands.",name());
|
logger.info("{} has started to roam the wastelands.", name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -79,9 +108,9 @@ public abstract class ActiveCreature{
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
We can see that any class that will extend the ActiveCreature class will have its own thread of control to invoke and execute methods.
|
We can see that any class that will extend the `ActiveCreature` class will have its own thread of control to invoke and execute methods.
|
||||||
|
|
||||||
For example, the Orc class:
|
For example, the `Orc` class:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public class Orc extends ActiveCreature {
|
public class Orc extends ActiveCreature {
|
||||||
@@ -89,13 +118,18 @@ public class Orc extends ActiveCreature {
|
|||||||
public Orc(String name) {
|
public Orc(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Now, we can create multiple creatures such as Orcs, tell them to eat and roam, and they will execute it on their own thread of control:
|
Now, we can create multiple creatures such as orcs, tell them to eat and roam, and they will execute it on their own thread of control:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
public class App implements Runnable {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(App.class.getName());
|
||||||
|
|
||||||
|
private static final int NUM_CREATURES = 3;
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
var app = new App();
|
var app = new App();
|
||||||
app.run();
|
app.run();
|
||||||
@@ -103,25 +137,86 @@ Now, we can create multiple creatures such as Orcs, tell them to eat and roam, a
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
ActiveCreature creature;
|
List<ActiveCreature> creatures = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
for (int i = 0;i < creatures;i++) {
|
for (int i = 0; i < NUM_CREATURES; i++) {
|
||||||
creature = new Orc(Orc.class.getSimpleName().toString() + i);
|
creatures.add(new Orc(Orc.class.getSimpleName() + i));
|
||||||
creature.eat();
|
creatures.get(i).eat();
|
||||||
creature.roam();
|
creatures.get(i).roam();
|
||||||
}
|
}
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
logger.error(e.getMessage());
|
logger.error(e.getMessage());
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
} finally {
|
||||||
|
for (int i = 0; i < NUM_CREATURES; i++) {
|
||||||
|
creatures.get(i).kill(0);
|
||||||
}
|
}
|
||||||
Runtime.getRuntime().exit(1);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Class diagram
|
Program output:
|
||||||
|
|
||||||

|
```
|
||||||
|
09:00:02.501 [Thread-0] INFO com.iluwatar.activeobject.ActiveCreature -- Orc0 is eating!
|
||||||
|
09:00:02.501 [Thread-2] INFO com.iluwatar.activeobject.ActiveCreature -- Orc2 is eating!
|
||||||
|
09:00:02.501 [Thread-1] INFO com.iluwatar.activeobject.ActiveCreature -- Orc1 is eating!
|
||||||
|
09:00:02.504 [Thread-0] INFO com.iluwatar.activeobject.ActiveCreature -- Orc0 has finished eating!
|
||||||
|
09:00:02.504 [Thread-1] INFO com.iluwatar.activeobject.ActiveCreature -- Orc1 has finished eating!
|
||||||
|
09:00:02.504 [Thread-0] INFO com.iluwatar.activeobject.ActiveCreature -- Orc0 has started to roam in the wastelands.
|
||||||
|
09:00:02.504 [Thread-2] INFO com.iluwatar.activeobject.ActiveCreature -- Orc2 has finished eating!
|
||||||
|
09:00:02.504 [Thread-1] INFO com.iluwatar.activeobject.ActiveCreature -- Orc1 has started to roam in the wastelands.
|
||||||
|
09:00:02.504 [Thread-2] INFO com.iluwatar.activeobject.ActiveCreature -- Orc2 has started to roam in the wastelands.
|
||||||
|
```
|
||||||
|
|
||||||
## Tutorials
|
## When to Use the Active Object Pattern in Java
|
||||||
|
|
||||||
* [Android and Java Concurrency: The Active Object Pattern](https://www.youtube.com/watch?v=Cd8t2u5Qmvc)
|
Use the Active Object pattern in Java when:
|
||||||
|
|
||||||
|
* when you need to handle asynchronous tasks without blocking the main thread, ensuring better performance and responsiveness.
|
||||||
|
* When you need to interact with external resources asynchronously.
|
||||||
|
* When you want to improve the responsiveness of your application.
|
||||||
|
* When you need to manage concurrent tasks in a modular and maintainable way.
|
||||||
|
|
||||||
|
## Active Object Pattern Java Tutorials
|
||||||
|
|
||||||
|
* [Android and Java Concurrency: The Active Object Pattern(Douglas Schmidt)](https://www.youtube.com/watch?v=Cd8t2u5Qmvc)
|
||||||
|
|
||||||
|
## Real-World Applications of Active Object Pattern in Java
|
||||||
|
|
||||||
|
* Real-time trading systems where transaction requests are handled asynchronously.
|
||||||
|
* GUIs where long-running tasks are executed in the background without freezing the user interface.
|
||||||
|
* Game programming to handle concurrent updates to game state or AI computations.
|
||||||
|
|
||||||
|
## Benefits and Trade-offs of Active Object Pattern
|
||||||
|
|
||||||
|
Discover the benefits and trade-offs of using the Active Object pattern in Java, including improved thread safety and potential overhead concerns.
|
||||||
|
|
||||||
|
Benefits:
|
||||||
|
|
||||||
|
* Improves responsiveness of the main thread.
|
||||||
|
* Encapsulates concurrency concerns within objects.
|
||||||
|
* Promotes better code organization and maintainability.
|
||||||
|
* Provides thread safety and avoids shared state access problems.
|
||||||
|
|
||||||
|
Trade-offs:
|
||||||
|
|
||||||
|
* Introduces additional overhead due to message passing and thread management.
|
||||||
|
* May not be suitable for all types of concurrency problems.
|
||||||
|
|
||||||
|
## Related Java Design Patterns
|
||||||
|
|
||||||
|
* [Command](https://java-design-patterns.com/patterns/command/): Encapsulates a request as an object, similarly to how the Active Object pattern encapsulates method calls.
|
||||||
|
* [Promise](https://java-design-patterns.com/patterns/promise/): Provides a means to retrieve the result of an asynchronous method call, often used in conjunction with Active Object.
|
||||||
|
* [Proxy](https://java-design-patterns.com/patterns/proxy/): The Active Object pattern can use a proxy to handle method invocations asynchronously.
|
||||||
|
|
||||||
|
## References and Credits
|
||||||
|
|
||||||
|
* [Design Patterns: Elements of Reusable Object Software](https://amzn.to/3HYqrBE)
|
||||||
|
* [Concurrent Programming in Java: Design Principles and Patterns](https://amzn.to/498SRVq)
|
||||||
|
* [Java Concurrency in Practice](https://amzn.to/4aRMruW)
|
||||||
|
* [Learning Concurrent Programming in Scala](https://amzn.to/3UE07nV)
|
||||||
|
* [Pattern Languages of Program Design 3](https://amzn.to/3OI1j61)
|
||||||
|
* [Pattern-Oriented Software Architecture Volume 2: Patterns for Concurrent and Networked Objects](https://amzn.to/3UgC24V)
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 82 KiB |
@@ -34,6 +34,14 @@
|
|||||||
</parent>
|
</parent>
|
||||||
<artifactId>active-object</artifactId>
|
<artifactId>active-object</artifactId>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter-engine</artifactId>
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
|||||||
@@ -29,11 +29,7 @@ import java.util.concurrent.LinkedBlockingQueue;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
/**
|
/** ActiveCreature class is the base of the active object example. */
|
||||||
* ActiveCreature class is the base of the active object example.
|
|
||||||
* @author Noam Greenshtain
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public abstract class ActiveCreature {
|
public abstract class ActiveCreature {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName());
|
private static final Logger logger = LoggerFactory.getLogger(ActiveCreature.class.getName());
|
||||||
@@ -46,14 +42,14 @@ public abstract class ActiveCreature {
|
|||||||
|
|
||||||
private int status; // status of the thread of execution.
|
private int status; // status of the thread of execution.
|
||||||
|
|
||||||
/**
|
/** Constructor and initialization. */
|
||||||
* Constructor and initialization.
|
|
||||||
*/
|
|
||||||
protected ActiveCreature(String name) {
|
protected ActiveCreature(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.status = 0;
|
this.status = 0;
|
||||||
this.requests = new LinkedBlockingQueue<>();
|
this.requests = new LinkedBlockingQueue<>();
|
||||||
thread = new Thread(() -> {
|
thread =
|
||||||
|
new Thread(
|
||||||
|
() -> {
|
||||||
boolean infinite = true;
|
boolean infinite = true;
|
||||||
while (infinite) {
|
while (infinite) {
|
||||||
try {
|
try {
|
||||||
@@ -72,10 +68,12 @@ public abstract class ActiveCreature {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Eats the porridge.
|
* Eats the porridge.
|
||||||
|
*
|
||||||
* @throws InterruptedException due to firing a new Runnable.
|
* @throws InterruptedException due to firing a new Runnable.
|
||||||
*/
|
*/
|
||||||
public void eat() throws InterruptedException {
|
public void eat() throws InterruptedException {
|
||||||
requests.put(() -> {
|
requests.put(
|
||||||
|
() -> {
|
||||||
logger.info("{} is eating!", name());
|
logger.info("{} is eating!", name());
|
||||||
logger.info("{} has finished eating!", name());
|
logger.info("{} has finished eating!", name());
|
||||||
});
|
});
|
||||||
@@ -83,16 +81,16 @@ public abstract class ActiveCreature {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Roam the wastelands.
|
* Roam the wastelands.
|
||||||
|
*
|
||||||
* @throws InterruptedException due to firing a new Runnable.
|
* @throws InterruptedException due to firing a new Runnable.
|
||||||
*/
|
*/
|
||||||
public void roam() throws InterruptedException {
|
public void roam() throws InterruptedException {
|
||||||
requests.put(() ->
|
requests.put(() -> logger.info("{} has started to roam in the wastelands.", name()));
|
||||||
logger.info("{} has started to roam in the wastelands.", name())
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the name of the creature.
|
* Returns the name of the creature.
|
||||||
|
*
|
||||||
* @return the name of the creature.
|
* @return the name of the creature.
|
||||||
*/
|
*/
|
||||||
public String name() {
|
public String name() {
|
||||||
@@ -101,6 +99,7 @@ public abstract class ActiveCreature {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Kills the thread of execution.
|
* Kills the thread of execution.
|
||||||
|
*
|
||||||
* @param status of the thread of execution. 0 == OK, the rest is logging an error.
|
* @param status of the thread of execution. 0 == OK, the rest is logging an error.
|
||||||
*/
|
*/
|
||||||
public void kill(int status) {
|
public void kill(int status) {
|
||||||
@@ -110,6 +109,7 @@ public abstract class ActiveCreature {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the status of the thread of execution.
|
* Returns the status of the thread of execution.
|
||||||
|
*
|
||||||
* @return the status of the thread of execution.
|
* @return the status of the thread of execution.
|
||||||
*/
|
*/
|
||||||
public int getStatus() {
|
public int getStatus() {
|
||||||
|
|||||||
@@ -31,9 +31,9 @@ import org.slf4j.LoggerFactory;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* The Active Object pattern helps to solve synchronization difficulties without using
|
* The Active Object pattern helps to solve synchronization difficulties without using
|
||||||
* 'synchronized' methods. The active object will contain a thread-safe data structure
|
* 'synchronized' methods. The active object will contain a thread-safe data structure (such as
|
||||||
* (such as BlockingQueue) and use to synchronize method calls by moving the logic of the method
|
* BlockingQueue) and use to synchronize method calls by moving the logic of the method into an
|
||||||
* into an invocator(usually a Runnable) and store it in the DSA.
|
* invocator(usually a Runnable) and store it in the DSA.
|
||||||
*
|
*
|
||||||
* <p>In this example, we fire 20 threads to modify a value in the target class.
|
* <p>In this example, we fire 20 threads to modify a value in the target class.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -24,15 +24,10 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.activeobject;
|
package com.iluwatar.activeobject;
|
||||||
|
|
||||||
/**
|
/** An implementation of the ActiveCreature class. */
|
||||||
* An implementation of the ActiveCreature class.
|
|
||||||
* @author Noam Greenshtain
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class Orc extends ActiveCreature {
|
public class Orc extends ActiveCreature {
|
||||||
|
|
||||||
public Orc(String name) {
|
public Orc(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -27,17 +27,16 @@ package com.iluwatar.activeobject;
|
|||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
class ActiveCreatureTest {
|
class ActiveCreatureTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void executionTest() throws InterruptedException {
|
void executionTest() throws InterruptedException {
|
||||||
ActiveCreature orc = new Orc("orc1");
|
ActiveCreature orc = new Orc("orc1");
|
||||||
assertEquals("orc1",orc.name());
|
assertEquals("orc1", orc.name());
|
||||||
assertEquals(0,orc.getStatus());
|
assertEquals(0, orc.getStatus());
|
||||||
orc.eat();
|
orc.eat();
|
||||||
orc.roam();
|
orc.roam();
|
||||||
orc.kill(0);
|
orc.kill(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -28,11 +28,10 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
|||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
|
||||||
class AppTest {
|
class AppTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldExecuteApplicationWithoutException() {
|
void shouldExecuteApplicationWithoutException() {
|
||||||
assertDoesNotThrow(() -> App.main(new String[]{}));
|
assertDoesNotThrow(() -> App.main(new String[] {}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,201 @@
|
|||||||
|
---
|
||||||
|
title: "Actor Model Pattern in Java: Building Concurrent Systems with Elegance"
|
||||||
|
shortTitle: Actor Model
|
||||||
|
description: "Explore the Actor Model pattern in Java with real-world examples and practical implementation. Learn how to build scalable, message-driven systems using actors, messages, and asynchronous communication."
|
||||||
|
category: Concurrency
|
||||||
|
language: en
|
||||||
|
tag:
|
||||||
|
- Concurrency
|
||||||
|
- Messaging
|
||||||
|
- Isolation
|
||||||
|
- Asynchronous
|
||||||
|
- Distributed Systems
|
||||||
|
- Actor Model
|
||||||
|
---
|
||||||
|
|
||||||
|
## Also Known As
|
||||||
|
|
||||||
|
- Message-passing concurrency
|
||||||
|
- Actor-based concurrency
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Intent of Actor Model Pattern
|
||||||
|
|
||||||
|
The Actor Model pattern enables the construction of highly concurrent, distributed, and fault-tolerant systems by using isolated components (actors) that interact exclusively through asynchronous message passing.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Detailed Explanation of Actor Model Pattern with Real-World Examples
|
||||||
|
|
||||||
|
### 📦 Real-world Example
|
||||||
|
|
||||||
|
Imagine a customer service system:
|
||||||
|
- Each **customer support agent** is an **actor**.
|
||||||
|
- Customers **send questions (messages)** to agents.
|
||||||
|
- Each agent handles one request at a time and can **respond asynchronously** without interfering with other agents.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🧠 In Plain Words
|
||||||
|
|
||||||
|
> "Actors are like independent workers that never share memory and only communicate through messages."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📖 Wikipedia Says
|
||||||
|
|
||||||
|
> [Actor model](https://en.wikipedia.org/wiki/Actor_model) is a mathematical model of concurrent computation that treats "actors" as the universal primitives of concurrent computation.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🧹 Architecture Diagram
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Programmatic Example of Actor Model Pattern in Java
|
||||||
|
|
||||||
|
### Actor.java
|
||||||
|
|
||||||
|
```java
|
||||||
|
public abstract class Actor implements Runnable {
|
||||||
|
|
||||||
|
@Setter @Getter private String actorId;
|
||||||
|
private final BlockingQueue<Message> mailbox = new LinkedBlockingQueue<>();
|
||||||
|
private volatile boolean active = true;
|
||||||
|
|
||||||
|
|
||||||
|
public void send(Message message) {
|
||||||
|
mailbox.add(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void onReceive(Message message);
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Message.java
|
||||||
|
|
||||||
|
```java
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class Message {
|
||||||
|
private final String content;
|
||||||
|
private final String senderId;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ActorSystem.java
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class ActorSystem {
|
||||||
|
public void startActor(Actor actor) {
|
||||||
|
String actorId = "actor-" + idCounter.incrementAndGet(); // Generate a new and unique ID
|
||||||
|
actor.setActorId(actorId); // assign the actor it's ID
|
||||||
|
actorRegister.put(actorId, actor); // Register and save the actor with it's ID
|
||||||
|
executor.submit(actor); // Run the actor in a thread
|
||||||
|
}
|
||||||
|
public Actor getActorById(String actorId) {
|
||||||
|
return actorRegister.get(actorId); // Find by Id
|
||||||
|
}
|
||||||
|
|
||||||
|
public void shutdown() {
|
||||||
|
executor.shutdownNow(); // Stop all threads
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### App.java
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class App {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
ActorSystem system = new ActorSystem();
|
||||||
|
Actor srijan = new ExampleActor(system);
|
||||||
|
Actor ansh = new ExampleActor2(system);
|
||||||
|
|
||||||
|
system.startActor(srijan);
|
||||||
|
system.startActor(ansh);
|
||||||
|
ansh.send(new Message("Hello ansh", srijan.getActorId()));
|
||||||
|
srijan.send(new Message("Hello srijan!", ansh.getActorId()));
|
||||||
|
|
||||||
|
Thread.sleep(1000); // Give time for messages to process
|
||||||
|
|
||||||
|
srijan.stop(); // Stop the actor gracefully
|
||||||
|
ansh.stop();
|
||||||
|
system.shutdown(); // Stop the actor system
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## When to Use the Actor Model Pattern in Java
|
||||||
|
|
||||||
|
- When building **concurrent or distributed systems**
|
||||||
|
- When you want **no shared mutable state**
|
||||||
|
- When you need **asynchronous, message-driven communication**
|
||||||
|
- When components should be **isolated and loosely coupled**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Actor Model Pattern Java Tutorials
|
||||||
|
|
||||||
|
- [Baeldung – Akka with Java](https://www.baeldung.com/java-akka)
|
||||||
|
- [Vaughn Vernon – Reactive Messaging Patterns](https://vaughnvernon.co/?p=1143)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Real-World Applications of Actor Model Pattern in Java
|
||||||
|
|
||||||
|
- [Akka Framework](https://akka.io/)
|
||||||
|
- [Erlang and Elixir concurrency](https://www.erlang.org/)
|
||||||
|
- [Microsoft Orleans](https://learn.microsoft.com/en-us/dotnet/orleans/)
|
||||||
|
- JVM-based game engines and simulators
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Benefits and Trade-offs of Actor Model Pattern
|
||||||
|
|
||||||
|
### ✅ Benefits
|
||||||
|
- High concurrency support
|
||||||
|
- Easy scaling across threads or machines
|
||||||
|
- Fault isolation and recovery
|
||||||
|
- Message ordering within actors
|
||||||
|
|
||||||
|
### ⚠️ Trade-offs
|
||||||
|
- Harder to debug due to asynchronous behavior
|
||||||
|
- Slight performance overhead due to message queues
|
||||||
|
- More complex to design than simple method calls
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Related Java Design Patterns
|
||||||
|
|
||||||
|
- [Command Pattern](../command)
|
||||||
|
- [Mediator Pattern](../mediator)
|
||||||
|
- [Event-Driven Architecture](../event-driven-architecture)
|
||||||
|
- [Observer Pattern](../observer)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## References and Credits
|
||||||
|
|
||||||
|
- *Programming Erlang*, Joe Armstrong
|
||||||
|
- *Reactive Design Patterns*, Roland Kuhn
|
||||||
|
- *The Actor Model in 10 Minutes*, [InfoQ Article](https://www.infoq.com/articles/actor-model/)
|
||||||
|
- [Akka Documentation](https://doc.akka.io/docs/akka/current/index.html)
|
||||||
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
@@ -0,0 +1,35 @@
|
|||||||
|
@startuml actor-model
|
||||||
|
|
||||||
|
title Actor Model - UML Class Diagram
|
||||||
|
|
||||||
|
class ActorSystem {
|
||||||
|
+actorOf(actor: Actor): Actor
|
||||||
|
+shutdown(): void
|
||||||
|
}
|
||||||
|
|
||||||
|
class Actor {
|
||||||
|
-mailbox: BlockingQueue<Message>
|
||||||
|
-active: boolean
|
||||||
|
+send(message: Message): void
|
||||||
|
+stop(): void
|
||||||
|
+run(): void
|
||||||
|
#onReceive(message: Message): void
|
||||||
|
}
|
||||||
|
|
||||||
|
class ExampleActor {
|
||||||
|
+onReceive(message: Message): void
|
||||||
|
}
|
||||||
|
|
||||||
|
class Message {
|
||||||
|
-content: String
|
||||||
|
-sender: Actor
|
||||||
|
+getContent(): String
|
||||||
|
+getSender(): Actor
|
||||||
|
}
|
||||||
|
|
||||||
|
ActorSystem --> Actor : creates
|
||||||
|
Actor <|-- ExampleActor : extends
|
||||||
|
Actor --> Message : processes
|
||||||
|
ExampleActor --> Message : uses
|
||||||
|
|
||||||
|
@enduml
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||||
|
|
||||||
|
The MIT License
|
||||||
|
Copyright © 2014-2022 Ilkka Seppälä
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
|
||||||
|
http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.iluwatar</groupId>
|
||||||
|
<artifactId>java-design-patterns</artifactId>
|
||||||
|
<version>1.26.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>actor-model</artifactId>
|
||||||
|
<name>Actor Model</name>
|
||||||
|
|
||||||
|
<!-- Force unified JUnit version to avoid classpath mismatches -->
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit</groupId>
|
||||||
|
<artifactId>junit-bom</artifactId>
|
||||||
|
<version>5.11.0</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.platform</groupId>
|
||||||
|
<artifactId>junit-platform-launcher</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<!-- Assembly plugin for creating fat JARs -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
|
<version>3.3.0</version>
|
||||||
|
<configuration>
|
||||||
|
<descriptorRefs>
|
||||||
|
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||||
|
</descriptorRefs>
|
||||||
|
<archive>
|
||||||
|
<manifest>
|
||||||
|
<mainClass>com.iluwatar.actormodel.App</mainClass>
|
||||||
|
</manifest>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>make-assembly</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>single</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||||
|
*
|
||||||
|
* The MIT License
|
||||||
|
* Copyright © 2014-2022 Ilkka Seppälä
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package com.iluwatar.actormodel;
|
||||||
|
|
||||||
|
import java.util.concurrent.BlockingQueue;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
public abstract class Actor implements Runnable {
|
||||||
|
|
||||||
|
@Setter @Getter private String actorId;
|
||||||
|
private final BlockingQueue<Message> mailbox = new LinkedBlockingQueue<>();
|
||||||
|
private volatile boolean active =
|
||||||
|
true; // always read from main memory and written back to main memory,
|
||||||
|
|
||||||
|
// rather than being cached in a thread's local memory. To make it consistent to all Actors
|
||||||
|
|
||||||
|
public void send(Message message) {
|
||||||
|
mailbox.add(message); // Add message to queue
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
active = false; // Stop the actor loop
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while (active) {
|
||||||
|
try {
|
||||||
|
Message message = mailbox.take(); // Wait for a message
|
||||||
|
onReceive(message); // Process it
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Child classes must define what to do with a message
|
||||||
|
protected abstract void onReceive(Message message);
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||||
|
*
|
||||||
|
* The MIT License
|
||||||
|
* Copyright © 2014-2022 Ilkka Seppälä
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package com.iluwatar.actormodel;
|
||||||
|
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
public class ActorSystem {
|
||||||
|
private final ExecutorService executor = Executors.newCachedThreadPool();
|
||||||
|
private final ConcurrentHashMap<String, Actor> actorRegister = new ConcurrentHashMap<>();
|
||||||
|
private final AtomicInteger idCounter = new AtomicInteger(0);
|
||||||
|
|
||||||
|
public void startActor(Actor actor) {
|
||||||
|
String actorId = "actor-" + idCounter.incrementAndGet(); // Generate a new and unique ID
|
||||||
|
actor.setActorId(actorId); // assign the actor it's ID
|
||||||
|
actorRegister.put(actorId, actor); // Register and save the actor with it's ID
|
||||||
|
executor.submit(actor); // Run the actor in a thread
|
||||||
|
}
|
||||||
|
|
||||||
|
public Actor getActorById(String actorId) {
|
||||||
|
return actorRegister.get(actorId); // Find by Id
|
||||||
|
}
|
||||||
|
|
||||||
|
public void shutdown() {
|
||||||
|
executor.shutdownNow(); // Stop all threads
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||||
|
*
|
||||||
|
* The MIT License
|
||||||
|
* Copyright © 2014-2022 Ilkka Seppälä
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Actor Model is a design pattern used to handle concurrency in a safe, scalable, and
|
||||||
|
* message-driven way.
|
||||||
|
*
|
||||||
|
* <p>In the Actor Model: - An **Actor** is an independent unit that has its own state and behavior.
|
||||||
|
* - Actors **communicate only through messages** — they do not share memory. - An **ActorSystem**
|
||||||
|
* is responsible for creating, starting, and managing the lifecycle of actors. - Messages are
|
||||||
|
* delivered asynchronously, and each actor processes them one at a time.
|
||||||
|
*
|
||||||
|
* <p>💡 Key benefits: - No shared memory = no need for complex thread-safety - Easy to scale with
|
||||||
|
* many actors - Suitable for highly concurrent or distributed systems
|
||||||
|
*
|
||||||
|
* <p>🔍 This example demonstrates the Actor Model: - `ActorSystem` starts two actors: `srijan` and
|
||||||
|
* `ansh`. - `ExampleActor` and `ExampleActor2` extend the `Actor` class and override the
|
||||||
|
* `onReceive()` method to handle messages. - Actors communicate using `send()` to pass `Message`
|
||||||
|
* objects that include the message content and sender's ID. - The actors process messages
|
||||||
|
* **asynchronously in separate threads**, and we allow a short delay (`Thread.sleep`) to let them
|
||||||
|
* run. - The system is shut down gracefully at the end.
|
||||||
|
*/
|
||||||
|
package com.iluwatar.actormodel;
|
||||||
|
|
||||||
|
public class App {
|
||||||
|
public static void main(String[] args) throws InterruptedException {
|
||||||
|
ActorSystem system = new ActorSystem();
|
||||||
|
Actor srijan = new ExampleActor(system);
|
||||||
|
Actor ansh = new ExampleActor2(system);
|
||||||
|
|
||||||
|
system.startActor(srijan);
|
||||||
|
system.startActor(ansh);
|
||||||
|
ansh.send(new Message("Hello ansh", srijan.getActorId()));
|
||||||
|
srijan.send(new Message("Hello srijan!", ansh.getActorId()));
|
||||||
|
|
||||||
|
Thread.sleep(1000); // Give time for messages to process
|
||||||
|
|
||||||
|
srijan.stop(); // Stop the actor gracefully
|
||||||
|
ansh.stop();
|
||||||
|
system.shutdown(); // Stop the actor system
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||||
|
*
|
||||||
|
* The MIT License
|
||||||
|
* Copyright © 2014-2022 Ilkka Seppälä
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package com.iluwatar.actormodel;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class ExampleActor extends Actor {
|
||||||
|
private final ActorSystem actorSystem;
|
||||||
|
@Getter private final List<String> receivedMessages = new ArrayList<>();
|
||||||
|
|
||||||
|
public ExampleActor(ActorSystem actorSystem) {
|
||||||
|
this.actorSystem = actorSystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Logger log = Logger.getLogger(getClass().getName());
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onReceive(Message message) {
|
||||||
|
LOGGER.info(
|
||||||
|
"[{}]Received : {} from : [{}]", getActorId(), message.getContent(), message.getSenderId());
|
||||||
|
Actor sender = actorSystem.getActorById(message.getSenderId()); // sender actor id
|
||||||
|
// Reply of the message
|
||||||
|
if (sender != null && !message.getSenderId().equals(getActorId())) {
|
||||||
|
sender.send(new Message("I got your message ", getActorId()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
-17
@@ -22,30 +22,25 @@
|
|||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
package com.iluwatar.threadpool;
|
package com.iluwatar.actormodel;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
/**
|
|
||||||
* Worker implements {@link Runnable} and thus can be executed by {@link
|
|
||||||
* java.util.concurrent.ExecutorService}.
|
|
||||||
*/
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class Worker implements Runnable {
|
public class ExampleActor2 extends Actor {
|
||||||
|
private final ActorSystem actorSystem;
|
||||||
|
@Getter private final List<String> receivedMessages = new ArrayList<>();
|
||||||
|
|
||||||
private final Task task;
|
public ExampleActor2(ActorSystem actorSystem) {
|
||||||
|
this.actorSystem = actorSystem;
|
||||||
public Worker(final Task task) {
|
|
||||||
this.task = task;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
protected void onReceive(Message message) {
|
||||||
LOGGER.info("{} processing {}", Thread.currentThread().getName(), task.toString());
|
receivedMessages.add(message.getContent());
|
||||||
try {
|
LOGGER.info("[{}]Received : {}", getActorId(), message.getContent());
|
||||||
Thread.sleep(task.getTimeMs());
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||||
|
*
|
||||||
|
* The MIT License
|
||||||
|
* Copyright © 2014-2022 Ilkka Seppälä
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package com.iluwatar.actormodel;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Getter
|
||||||
|
public class Message {
|
||||||
|
private final String content;
|
||||||
|
private final String senderId;
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||||
|
*
|
||||||
|
* The MIT License
|
||||||
|
* Copyright © 2014-2022 Ilkka Seppälä
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package com.iluwatar.actor;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
import com.iluwatar.actormodel.ActorSystem;
|
||||||
|
import com.iluwatar.actormodel.App;
|
||||||
|
import com.iluwatar.actormodel.ExampleActor;
|
||||||
|
import com.iluwatar.actormodel.ExampleActor2;
|
||||||
|
import com.iluwatar.actormodel.Message;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class ActorModelTest {
|
||||||
|
@Test
|
||||||
|
void testMainMethod() throws InterruptedException {
|
||||||
|
App.main(new String[] {});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMessagePassing() throws InterruptedException {
|
||||||
|
ActorSystem system = new ActorSystem();
|
||||||
|
|
||||||
|
ExampleActor srijan = new ExampleActor(system);
|
||||||
|
ExampleActor2 ansh = new ExampleActor2(system);
|
||||||
|
|
||||||
|
system.startActor(srijan);
|
||||||
|
system.startActor(ansh);
|
||||||
|
|
||||||
|
// Ansh recieves a message from Srijan
|
||||||
|
ansh.send(new Message("Hello ansh", srijan.getActorId()));
|
||||||
|
|
||||||
|
// Wait briefly to allow async processing
|
||||||
|
Thread.sleep(200);
|
||||||
|
|
||||||
|
// Check that Srijan received the message
|
||||||
|
assertTrue(
|
||||||
|
ansh.getReceivedMessages().contains("Hello ansh"),
|
||||||
|
"ansh should receive the message from Srijan");
|
||||||
|
}
|
||||||
|
}
|
||||||
+68
-44
@@ -1,22 +1,25 @@
|
|||||||
---
|
---
|
||||||
title: Acyclic Visitor
|
title: "Acyclic Visitor Pattern in Java: Streamlining Object Interactions"
|
||||||
|
shortTitle: Acyclic Visitor
|
||||||
|
description: "Learn about the Acyclic Visitor pattern in Java. This guide explains how it decouples operations from object hierarchies, providing examples and real-world applications."
|
||||||
category: Behavioral
|
category: Behavioral
|
||||||
language: en
|
language: en
|
||||||
tag:
|
tag:
|
||||||
|
- Decoupling
|
||||||
- Extensibility
|
- Extensibility
|
||||||
|
- Interface
|
||||||
|
- Object composition
|
||||||
---
|
---
|
||||||
|
|
||||||
## Intent
|
## Intent of Acyclic Visitor Design Pattern
|
||||||
|
|
||||||
Allow new functions to be added to existing class hierarchies without affecting those hierarchies, and without creating
|
The Acyclic Visitor pattern in Java decouples operations from an object hierarchy, providing a flexible design for various applications.
|
||||||
the troublesome dependency cycles that are inherent to the GoF Visitor Pattern.
|
|
||||||
|
|
||||||
## Explanation
|
## Detailed Explanation of Acyclic Visitor Pattern with Real-World Examples
|
||||||
|
|
||||||
Real world example
|
Real-world example
|
||||||
|
|
||||||
> We have a hierarchy of modem classes. The modems in this hierarchy need to be visited by an external algorithm based
|
> An analogous real-world example of the Acyclic Visitor pattern in Java is a museum guide system, demonstrating the practical application of this design pattern. Imagine a museum with various exhibits like paintings, sculptures, and historical artifacts. The museum has different types of guides (audio guide, human guide, virtual reality guide) that provide information about each exhibit. Instead of modifying the exhibits every time a new guide type is introduced, each guide implements an interface to visit different exhibit types. This way, the museum can add new types of guides without altering the existing exhibits, ensuring that the system remains extensible and maintainable without forming any dependency cycles.
|
||||||
> on filtering criteria (is it Unix or DOS compatible modem).
|
|
||||||
|
|
||||||
In plain words
|
In plain words
|
||||||
|
|
||||||
@@ -24,10 +27,16 @@ In plain words
|
|||||||
|
|
||||||
[WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor) says
|
[WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor) says
|
||||||
|
|
||||||
> The Acyclic Visitor pattern allows new functions to be added to existing class hierarchies without affecting those
|
> The Acyclic Visitor pattern allows new functions to be added to existing class hierarchies without affecting those hierarchies, and without creating the dependency cycles that are inherent to the GangOfFour VisitorPattern.
|
||||||
> hierarchies, and without creating the dependency cycles that are inherent to the GangOfFour VisitorPattern.
|
|
||||||
|
|
||||||
**Programmatic Example**
|
Sequence diagram
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Programmatic Example of Acyclic Visitor in Java
|
||||||
|
|
||||||
|
In this Java example, we have a hierarchy of modem classes illustrating the Acyclic Visitor pattern. The modems in this hierarchy need to be visited by an external algorithm based on filtering criteria (is it Unix or DOS compatible modem).
|
||||||
|
|
||||||
Here's the `Modem` hierarchy.
|
Here's the `Modem` hierarchy.
|
||||||
|
|
||||||
@@ -37,7 +46,9 @@ public abstract class Modem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class Zoom extends Modem {
|
public class Zoom extends Modem {
|
||||||
...
|
|
||||||
|
// Other properties and methods...
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void accept(ModemVisitor modemVisitor) {
|
public void accept(ModemVisitor modemVisitor) {
|
||||||
if (modemVisitor instanceof ZoomVisitor) {
|
if (modemVisitor instanceof ZoomVisitor) {
|
||||||
@@ -49,7 +60,9 @@ public class Zoom extends Modem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class Hayes extends Modem {
|
public class Hayes extends Modem {
|
||||||
...
|
|
||||||
|
// Other properties and methods...
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void accept(ModemVisitor modemVisitor) {
|
public void accept(ModemVisitor modemVisitor) {
|
||||||
if (modemVisitor instanceof HayesVisitor) {
|
if (modemVisitor instanceof HayesVisitor) {
|
||||||
@@ -61,7 +74,7 @@ public class Hayes extends Modem {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Next we introduce the `ModemVisitor` hierarchy.
|
Next, we introduce the `ModemVisitor` hierarchy.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public interface ModemVisitor {
|
public interface ModemVisitor {
|
||||||
@@ -79,11 +92,14 @@ public interface AllModemVisitor extends ZoomVisitor, HayesVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class ConfigureForDosVisitor implements AllModemVisitor {
|
public class ConfigureForDosVisitor implements AllModemVisitor {
|
||||||
...
|
|
||||||
|
// Other properties and methods...
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Hayes hayes) {
|
public void visit(Hayes hayes) {
|
||||||
LOGGER.info(hayes + " used with Dos configurator.");
|
LOGGER.info(hayes + " used with Dos configurator.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Zoom zoom) {
|
public void visit(Zoom zoom) {
|
||||||
LOGGER.info(zoom + " used with Dos configurator.");
|
LOGGER.info(zoom + " used with Dos configurator.");
|
||||||
@@ -91,7 +107,9 @@ public class ConfigureForDosVisitor implements AllModemVisitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class ConfigureForUnixVisitor implements ZoomVisitor {
|
public class ConfigureForUnixVisitor implements ZoomVisitor {
|
||||||
...
|
|
||||||
|
// Other properties and methods...
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Zoom zoom) {
|
public void visit(Zoom zoom) {
|
||||||
LOGGER.info(zoom + " used with Unix configurator.");
|
LOGGER.info(zoom + " used with Unix configurator.");
|
||||||
@@ -102,30 +120,30 @@ public class ConfigureForUnixVisitor implements ZoomVisitor {
|
|||||||
Finally, here are the visitors in action.
|
Finally, here are the visitors in action.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
public static void main(String[] args) {
|
||||||
var conUnix = new ConfigureForUnixVisitor();
|
var conUnix = new ConfigureForUnixVisitor();
|
||||||
var conDos = new ConfigureForDosVisitor();
|
var conDos = new ConfigureForDosVisitor();
|
||||||
|
|
||||||
var zoom = new Zoom();
|
var zoom = new Zoom();
|
||||||
var hayes = new Hayes();
|
var hayes = new Hayes();
|
||||||
hayes.accept(conDos);
|
|
||||||
zoom.accept(conDos);
|
hayes.accept(conDos); // Hayes modem with Dos configurator
|
||||||
hayes.accept(conUnix);
|
zoom.accept(conDos); // Zoom modem with Dos configurator
|
||||||
zoom.accept(conUnix);
|
hayes.accept(conUnix); // Hayes modem with Unix configurator
|
||||||
|
zoom.accept(conUnix); // Zoom modem with Unix configurator
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Program output:
|
Program output:
|
||||||
|
|
||||||
```
|
```
|
||||||
// Hayes modem used with Dos configurator.
|
09:15:11.125 [main] INFO com.iluwatar.acyclicvisitor.ConfigureForDosVisitor -- Hayes modem used with Dos configurator.
|
||||||
// Zoom modem used with Dos configurator.
|
09:15:11.127 [main] INFO com.iluwatar.acyclicvisitor.ConfigureForDosVisitor -- Zoom modem used with Dos configurator.
|
||||||
// Only HayesVisitor is allowed to visit Hayes modem
|
09:15:11.127 [main] INFO com.iluwatar.acyclicvisitor.Hayes -- Only HayesVisitor is allowed to visit Hayes modem
|
||||||
// Zoom modem used with Unix configurator.
|
09:15:11.127 [main] INFO com.iluwatar.acyclicvisitor.ConfigureForUnixVisitor -- Zoom modem used with Unix configurator.
|
||||||
```
|
```
|
||||||
|
|
||||||
## Class diagram
|
## When to Use the Acyclic Visitor Pattern in Java
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Applicability
|
|
||||||
|
|
||||||
This pattern can be used:
|
This pattern can be used:
|
||||||
|
|
||||||
@@ -135,28 +153,34 @@ This pattern can be used:
|
|||||||
* When the visited class hierarchy will be frequently extended with new derivatives of the Element class.
|
* When the visited class hierarchy will be frequently extended with new derivatives of the Element class.
|
||||||
* When the recompilation, relinking, retesting or redistribution of the derivatives of Element is very expensive.
|
* When the recompilation, relinking, retesting or redistribution of the derivatives of Element is very expensive.
|
||||||
|
|
||||||
## Tutorial
|
## Acyclic Visitor Pattern Java Tutorials
|
||||||
|
|
||||||
* [Acyclic Visitor Pattern Example](https://codecrafter.blogspot.com/2012/12/the-acyclic-visitor-pattern.html)
|
* [The Acyclic Visitor Pattern (Code Crafter)](https://codecrafter.blogspot.com/2012/12/the-acyclic-visitor-pattern.html)
|
||||||
|
|
||||||
## Consequences
|
## Benefits and Trade-offs of Acyclic Visitor Pattern
|
||||||
|
|
||||||
The good:
|
Benefits:
|
||||||
|
|
||||||
* No dependency cycles between class hierarchies.
|
* Extensible: New operations can be added easily without changing the object structure.
|
||||||
* No need to recompile all the visitors if a new one is added.
|
* Decoupled: Reduces coupling between the objects and the operations on them.
|
||||||
* Does not cause compilation failure in existing visitors if class hierarchy has a new member.
|
* No dependency cycles: Ensures acyclic dependencies, improving maintainability and reducing complexity.
|
||||||
|
|
||||||
The bad:
|
Trade-offs:
|
||||||
|
|
||||||
* Violates [Liskov's Substitution Principle](https://java-design-patterns.com/principles/#liskov-substitution-principle) by showing that it can accept all visitors but actually only being interested in particular visitors.
|
* Increased complexity: Can introduce additional complexity with the need for multiple visitor interfaces.
|
||||||
* Parallel hierarchy of visitors has to be created for all members in visitable class hierarchy.
|
* Maintenance overhead: Modifying the object hierarchy requires updating all visitors.
|
||||||
|
|
||||||
## Related patterns
|
## Related Java Design Patterns
|
||||||
|
|
||||||
* [Visitor Pattern](https://java-design-patterns.com/patterns/visitor/)
|
* [Composite](https://java-design-patterns.com/patterns/composite/): Often used in conjunction with Acyclic Visitor to allow treating individual objects and compositions uniformly.
|
||||||
|
* [Decorator](https://java-design-patterns.com/patterns/decorator/): Can be used alongside to add responsibilities to objects dynamically.
|
||||||
|
* [Visitor](https://java-design-patterns.com/patterns/visitor/): The Acyclic Visitor pattern is a variation of the Visitor pattern that avoids cyclic dependencies.
|
||||||
|
|
||||||
## Credits
|
## References and Credits
|
||||||
|
|
||||||
* [Acyclic Visitor by Robert C. Martin](http://condor.depaul.edu/dmumaugh/OOT/Design-Principles/acv.pdf)
|
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI)
|
||||||
* [Acyclic Visitor in WikiWikiWeb](https://wiki.c2.com/?AcyclicVisitor)
|
* [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/49NGldq)
|
||||||
|
* [Java Design Patterns: A Hands-On Experience with Real-World Examples](https://amzn.to/3yhh525)
|
||||||
|
* [Patterns in Java: A Catalog of Reusable Design Patterns Illustrated with UML](https://amzn.to/4bOtzwF)
|
||||||
|
* [Acyclic Visitor (Robert C. Martin)](http://condor.depaul.edu/dmumaugh/OOT/Design-Principles/acv.pdf)
|
||||||
|
* [Acyclic Visitor (WikiWikiWeb)](https://wiki.c2.com/?AcyclicVisitor)
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
@@ -34,6 +34,14 @@
|
|||||||
</parent>
|
</parent>
|
||||||
<artifactId>acyclic-visitor</artifactId>
|
<artifactId>acyclic-visitor</artifactId>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter-engine</artifactId>
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
|||||||
@@ -28,6 +28,4 @@ package com.iluwatar.acyclicvisitor;
|
|||||||
* All ModemVisitor interface extends all visitor interfaces. This interface provides ease of use
|
* All ModemVisitor interface extends all visitor interfaces. This interface provides ease of use
|
||||||
* when a visitor needs to visit all modem types.
|
* when a visitor needs to visit all modem types.
|
||||||
*/
|
*/
|
||||||
public interface AllModemVisitor extends ZoomVisitor, HayesVisitor {
|
public interface AllModemVisitor extends ZoomVisitor, HayesVisitor {}
|
||||||
|
|
||||||
}
|
|
||||||
@@ -37,9 +37,7 @@ package com.iluwatar.acyclicvisitor;
|
|||||||
*/
|
*/
|
||||||
public class App {
|
public class App {
|
||||||
|
|
||||||
/**
|
/** Program's entry point. */
|
||||||
* Program's entry point.
|
|
||||||
*/
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
var conUnix = new ConfigureForUnixVisitor();
|
var conUnix = new ConfigureForUnixVisitor();
|
||||||
var conDos = new ConfigureForDosVisitor();
|
var conDos = new ConfigureForDosVisitor();
|
||||||
|
|||||||
+1
-2
@@ -27,8 +27,7 @@ package com.iluwatar.acyclicvisitor;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ConfigureForDosVisitor class implements both zoom's and hayes' visit method for Dos
|
* ConfigureForDosVisitor class implements both zoom's and hayes' visit method for Dos manufacturer.
|
||||||
* manufacturer.
|
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class ConfigureForDosVisitor implements AllModemVisitor {
|
public class ConfigureForDosVisitor implements AllModemVisitor {
|
||||||
|
|||||||
@@ -26,15 +26,11 @@ package com.iluwatar.acyclicvisitor;
|
|||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
/**
|
/** Hayes class implements its accept method. */
|
||||||
* Hayes class implements its accept method.
|
|
||||||
*/
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class Hayes implements Modem {
|
public class Hayes implements Modem {
|
||||||
|
|
||||||
/**
|
/** Accepts all visitors but honors only HayesVisitor. */
|
||||||
* Accepts all visitors but honors only HayesVisitor.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void accept(ModemVisitor modemVisitor) {
|
public void accept(ModemVisitor modemVisitor) {
|
||||||
if (modemVisitor instanceof HayesVisitor) {
|
if (modemVisitor instanceof HayesVisitor) {
|
||||||
@@ -42,12 +38,9 @@ public class Hayes implements Modem {
|
|||||||
} else {
|
} else {
|
||||||
LOGGER.info("Only HayesVisitor is allowed to visit Hayes modem");
|
LOGGER.info("Only HayesVisitor is allowed to visit Hayes modem");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Hayes' modem's toString method. */
|
||||||
* Hayes' modem's toString method.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "Hayes modem";
|
return "Hayes modem";
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.acyclicvisitor;
|
package com.iluwatar.acyclicvisitor;
|
||||||
|
|
||||||
/**
|
/** HayesVisitor interface. */
|
||||||
* HayesVisitor interface.
|
|
||||||
*/
|
|
||||||
public interface HayesVisitor extends ModemVisitor {
|
public interface HayesVisitor extends ModemVisitor {
|
||||||
void visit(Hayes hayes);
|
void visit(Hayes hayes);
|
||||||
}
|
}
|
||||||
@@ -24,10 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.acyclicvisitor;
|
package com.iluwatar.acyclicvisitor;
|
||||||
|
|
||||||
/**
|
/** //Modem abstract class. converted to an interface */
|
||||||
* //Modem abstract class.
|
|
||||||
* converted to an interface
|
|
||||||
*/
|
|
||||||
public interface Modem {
|
public interface Modem {
|
||||||
void accept(ModemVisitor modemVisitor);
|
void accept(ModemVisitor modemVisitor);
|
||||||
}
|
}
|
||||||
@@ -26,15 +26,11 @@ package com.iluwatar.acyclicvisitor;
|
|||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
/**
|
/** Zoom class implements its accept method. */
|
||||||
* Zoom class implements its accept method.
|
|
||||||
*/
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class Zoom implements Modem {
|
public class Zoom implements Modem {
|
||||||
|
|
||||||
/**
|
/** Accepts all visitors but honors only ZoomVisitor. */
|
||||||
* Accepts all visitors but honors only ZoomVisitor.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void accept(ModemVisitor modemVisitor) {
|
public void accept(ModemVisitor modemVisitor) {
|
||||||
if (modemVisitor instanceof ZoomVisitor) {
|
if (modemVisitor instanceof ZoomVisitor) {
|
||||||
@@ -44,9 +40,7 @@ public class Zoom implements Modem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** Zoom modem's toString method. */
|
||||||
* Zoom modem's toString method.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "Zoom modem";
|
return "Zoom modem";
|
||||||
|
|||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.acyclicvisitor;
|
package com.iluwatar.acyclicvisitor;
|
||||||
|
|
||||||
/**
|
/** ZoomVisitor interface. */
|
||||||
* ZoomVisitor interface.
|
|
||||||
*/
|
|
||||||
public interface ZoomVisitor extends ModemVisitor {
|
public interface ZoomVisitor extends ModemVisitor {
|
||||||
void visit(Zoom zoom);
|
void visit(Zoom zoom);
|
||||||
}
|
}
|
||||||
@@ -24,25 +24,22 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.acyclicvisitor;
|
package com.iluwatar.acyclicvisitor;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||||
|
|
||||||
/**
|
import org.junit.jupiter.api.Test;
|
||||||
* Tests that the Acyclic Visitor example runs without errors.
|
|
||||||
*/
|
/** Tests that the Acyclic Visitor example runs without errors. */
|
||||||
class AppTest {
|
class AppTest {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Issue: Add at least one assertion to this test case.
|
* Issue: Add at least one assertion to this test case.
|
||||||
*
|
*
|
||||||
* Solution: Inserted assertion to check whether the execution of the main method in {@link App}
|
* <p>Solution: Inserted assertion to check whether the execution of the main method in {@link
|
||||||
* throws an exception.
|
* App} throws an exception.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldExecuteApplicationWithoutException() {
|
void shouldExecuteApplicationWithoutException() {
|
||||||
|
|
||||||
assertDoesNotThrow(() -> App.main(new String[]{}));
|
assertDoesNotThrow(() -> App.main(new String[] {}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -24,14 +24,12 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.acyclicvisitor;
|
package com.iluwatar.acyclicvisitor;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
/**
|
import org.junit.jupiter.api.Test;
|
||||||
* Hayes test class
|
|
||||||
*/
|
/** Hayes test class */
|
||||||
class HayesTest {
|
class HayesTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -24,16 +24,13 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.acyclicvisitor;
|
package com.iluwatar.acyclicvisitor;
|
||||||
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
/**
|
import org.junit.jupiter.api.Test;
|
||||||
* Zoom test class
|
|
||||||
*/
|
/** Zoom test class */
|
||||||
class ZoomTest {
|
class ZoomTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
+58
-43
@@ -1,25 +1,31 @@
|
|||||||
---
|
---
|
||||||
title: Adapter
|
title: "Adapter Pattern in Java: Seamless Integration of Incompatible Systems"
|
||||||
|
shortTitle: Adapter
|
||||||
|
description: "Learn how the Adapter Design Pattern works in Java with detailed examples and use cases. Understand how it enables compatibility between incompatible interfaces."
|
||||||
category: Structural
|
category: Structural
|
||||||
language: en
|
language: en
|
||||||
tag:
|
tag:
|
||||||
|
- Compatibility
|
||||||
|
- Decoupling
|
||||||
- Gang of Four
|
- Gang of Four
|
||||||
|
- Interface
|
||||||
|
- Object composition
|
||||||
|
- Wrapping
|
||||||
---
|
---
|
||||||
|
|
||||||
## Also known as
|
## Also known as
|
||||||
Wrapper
|
|
||||||
|
|
||||||
## Intent
|
* Wrapper
|
||||||
Convert the interface of a class into another interface the clients expect. Adapter lets classes work together that
|
|
||||||
couldn't otherwise because of incompatible interfaces.
|
|
||||||
|
|
||||||
## Explanation
|
## Intent of Adapter Design Pattern
|
||||||
|
|
||||||
|
The Adapter Design Pattern in Java converts the interface of a class into another interface that clients expect, enabling compatibility.
|
||||||
|
|
||||||
|
## Detailed Explanation of Adapter Pattern with Real-World Examples
|
||||||
|
|
||||||
Real-world example
|
Real-world example
|
||||||
|
|
||||||
> Consider that you have some pictures on your memory card and you need to transfer them to your computer. To transfer them, you need some kind of adapter that is compatible with your computer ports so that you can attach a memory card to your computer. In this case card reader is an adapter.
|
> Consider that you have some pictures on your memory card and you need to transfer them to your computer. To transfer them, you need some kind of adapter that is compatible with your computer ports so that you can attach a memory card to your computer. In this case card reader is an adapter. Another example would be the famous power adapter; a three-legged plug can't be connected to a two-pronged outlet, it needs to use a power adapter that makes it compatible with the two-pronged outlets. Yet another example would be a translator translating words spoken by one person to another
|
||||||
> Another example would be the famous power adapter; a three-legged plug can't be connected to a two-pronged outlet, it needs to use a power adapter that makes it compatible with the two-pronged outlets.
|
|
||||||
> Yet another example would be a translator translating words spoken by one person to another
|
|
||||||
|
|
||||||
In plain words
|
In plain words
|
||||||
|
|
||||||
@@ -29,9 +35,15 @@ Wikipedia says
|
|||||||
|
|
||||||
> In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing class to be used as another interface. It is often used to make existing classes work with others without modifying their source code.
|
> In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing class to be used as another interface. It is often used to make existing classes work with others without modifying their source code.
|
||||||
|
|
||||||
**Programmatic Example**
|
Sequence diagram
|
||||||
|
|
||||||
Consider a captain that can only use rowing boats and cannot sail at all.
|

|
||||||
|
|
||||||
|
## Programmatic Example of Adapter Pattern in Java
|
||||||
|
|
||||||
|
The Adapter Pattern example in Java shows how a class with an incompatible interface can be adapted to work with another class.
|
||||||
|
|
||||||
|
Consider a wannabe captain that can only use rowing boats but can't sail at all.
|
||||||
|
|
||||||
First, we have interfaces `RowingBoat` and `FishingBoat`
|
First, we have interfaces `RowingBoat` and `FishingBoat`
|
||||||
|
|
||||||
@@ -48,12 +60,13 @@ public class FishingBoat {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
And captain expects an implementation of `RowingBoat` interface to be able to move
|
The captain expects an implementation of `RowingBoat` interface to be able to move.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public class Captain {
|
public class Captain {
|
||||||
|
|
||||||
private final RowingBoat rowingBoat;
|
private final RowingBoat rowingBoat;
|
||||||
|
|
||||||
// default constructor and setter for rowingBoat
|
// default constructor and setter for rowingBoat
|
||||||
public Captain(RowingBoat rowingBoat) {
|
public Captain(RowingBoat rowingBoat) {
|
||||||
this.rowingBoat = rowingBoat;
|
this.rowingBoat = rowingBoat;
|
||||||
@@ -65,7 +78,7 @@ public class Captain {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Now let's say the pirates are coming and our captain needs to escape but there is only a fishing boat available. We need to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills.
|
Now, let's say the pirates are coming and our captain needs to escape but there is only a fishing boat available. We need to create an adapter that allows the captain to operate the fishing boat with his rowing boat skills.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -84,56 +97,58 @@ public class FishingBoatAdapter implements RowingBoat {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
And now the `Captain` can use the `FishingBoat` to escape the pirates.
|
Now the `Captain` can use the `FishingBoat` to escape the pirates.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
var captain = new Captain(new FishingBoatAdapter());
|
public static void main(final String[] args) {
|
||||||
captain.row();
|
// The captain can only operate rowing boats but with adapter he is able to
|
||||||
|
// use fishing boats as well
|
||||||
|
var captain = new Captain(new FishingBoatAdapter());
|
||||||
|
captain.row();
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Class diagram
|
The program outputs:
|
||||||

|
|
||||||
|
|
||||||
## Applicability
|
```
|
||||||
Use the Adapter pattern when
|
10:25:08.074 [main] INFO com.iluwatar.adapter.FishingBoat -- The fishing boat is sailing
|
||||||
|
```
|
||||||
|
|
||||||
|
## When to Use the Adapter Pattern in Java
|
||||||
|
|
||||||
|
Use the Adapter pattern in Java when
|
||||||
|
|
||||||
* You want to use an existing class, and its interface does not match the one you need
|
* You want to use an existing class, and its interface does not match the one you need
|
||||||
* You want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't necessarily have compatible interfaces
|
* You want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don't necessarily have compatible interfaces
|
||||||
* You need to use several existing subclasses, but it's impractical to adapt their interface by subclassing everyone. An object adapter can adapt the interface of its parent class.
|
* You need to use several existing subclasses, but it's impractical to adapt their interface by subclassing everyone. An object adapter can adapt the interface of its parent class.
|
||||||
* Most of the applications using third-party libraries use adapters as a middle layer between the application and the 3rd party library to decouple the application from the library. If another library has to be used only an adapter for the new library is required without having to change the application code.
|
* Most of the applications using third-party libraries use adapters as a middle layer between the application and the 3rd party library to decouple the application from the library. If another library has to be used only an adapter for the new library is required without having to change the application code.
|
||||||
|
|
||||||
## Tutorials
|
## Adapter Pattern Java Tutorials
|
||||||
|
|
||||||
* [Dzone](https://dzone.com/articles/adapter-design-pattern-in-java)
|
* [Using the Adapter Design Pattern in Java (Dzone)](https://dzone.com/articles/adapter-design-pattern-in-java)
|
||||||
* [Refactoring Guru](https://refactoring.guru/design-patterns/adapter/java/example)
|
* [Adapter in Java (Refactoring Guru)](https://refactoring.guru/design-patterns/adapter/java/example)
|
||||||
* [Baeldung](https://www.baeldung.com/java-adapter-pattern)
|
* [The Adapter Pattern in Java (Baeldung)](https://www.baeldung.com/java-adapter-pattern)
|
||||||
* [GeeksforGeeks](https://www.geeksforgeeks.org/adapter-pattern/)
|
* [Adapter Design Pattern (GeeksForGeeks)](https://www.geeksforgeeks.org/adapter-pattern/)
|
||||||
|
|
||||||
|
## Benefits and Trade-offs of Adapter Pattern
|
||||||
|
|
||||||
## Consequences
|
Class and object adapters offer different benefits and drawbacks. A class adapter adapts the Adaptee to the Target by binding to a specific Adaptee class, which means it cannot adapt a class and all its subclasses. This type of adapter allows the Adapter to override some of the Adaptee’s behavior because the Adapter is a subclass of the Adaptee. Additionally, it introduces only one object without needing extra pointer indirection to reach the Adaptee.
|
||||||
Class and object adapters have different trade-offs. A class adapter
|
|
||||||
|
|
||||||
* Adapts Adaptee to Target by committing to a concrete Adaptee class. As a consequence, a class adapter won’t work when we want to adapt a class and all its subclasses.
|
On the other hand, an object adapter allows a single Adapter to work with multiple Adaptees, including the Adaptee and all its subclasses. This type of adapter can add functionality to all Adaptees simultaneously. However, it makes overriding the Adaptee’s behavior more difficult, as it requires subclassing the Adaptee and having the Adapter refer to this subclass instead of the Adaptee itself.
|
||||||
* Lets Adapter override some of Adaptee’s behavior since Adapter is a subclass of Adaptee.
|
|
||||||
* Introduces only one object, and no additional pointer indirection is needed to get to the adaptee.
|
|
||||||
|
|
||||||
An object adapter
|
## Real-World Applications of Adapter Pattern in Java
|
||||||
|
|
||||||
* Lets a single Adapter work with many Adaptees, that is, the Adaptee itself and all of its subclasses (if any). The Adapter can also add functionality to all Adaptees at once.
|
|
||||||
* Makes it harder to override Adaptee behavior. It will require subclassing Adaptee and making the Adapter refer to the subclass rather than the Adaptee itself.
|
|
||||||
|
|
||||||
|
|
||||||
## Real-world examples
|
|
||||||
|
|
||||||
|
* `java.io.InputStreamReader` and `java.io.OutputStreamWriter` in the Java IO library.
|
||||||
|
* GUI component libraries that allow for plug-ins or adapters to convert between different GUI component interfaces.
|
||||||
* [java.util.Arrays#asList()](http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#asList%28T...%29)
|
* [java.util.Arrays#asList()](http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#asList%28T...%29)
|
||||||
* [java.util.Collections#list()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#list-java.util.Enumeration-)
|
* [java.util.Collections#list()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#list-java.util.Enumeration-)
|
||||||
* [java.util.Collections#enumeration()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#enumeration-java.util.Collection-)
|
* [java.util.Collections#enumeration()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#enumeration-java.util.Collection-)
|
||||||
* [javax.xml.bind.annotation.adapters.XMLAdapter](http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html#marshal-BoundType-)
|
* [javax.xml.bind.annotation.adapters.XMLAdapter](http://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html#marshal-BoundType-)
|
||||||
|
|
||||||
|
## References and Credits
|
||||||
|
|
||||||
## Credits
|
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://amzn.to/3w0pvKI)
|
||||||
|
* [Effective Java](https://amzn.to/4cGk2Jz)
|
||||||
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59)
|
* [Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software](https://amzn.to/49NGldq)
|
||||||
* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=48d37c67fb3d845b802fa9b619ad8f31)
|
* [J2EE Design Patterns](https://amzn.to/4dpzgmx)
|
||||||
* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b)
|
* [Refactoring to Patterns](https://amzn.to/3VOO4F5)
|
||||||
* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7)
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
+9
-1
@@ -4,7 +4,7 @@
|
|||||||
This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||||
|
|
||||||
The MIT License
|
The MIT License
|
||||||
Copyright © 2014-2023 Ilkka Seppälä
|
Copyright © 2014-2022 Ilkka Seppälä
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -34,6 +34,14 @@
|
|||||||
</parent>
|
</parent>
|
||||||
<artifactId>adapter</artifactId>
|
<artifactId>adapter</artifactId>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter-engine</artifactId>
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
|||||||
@@ -37,16 +37,15 @@ package com.iluwatar.adapter;
|
|||||||
* <p>The Adapter ({@link FishingBoatAdapter}) converts the interface of the adaptee class ({@link
|
* <p>The Adapter ({@link FishingBoatAdapter}) converts the interface of the adaptee class ({@link
|
||||||
* FishingBoat}) into a suitable one expected by the client ({@link RowingBoat}).
|
* FishingBoat}) into a suitable one expected by the client ({@link RowingBoat}).
|
||||||
*
|
*
|
||||||
* <p>The story of this implementation is this. <br> Pirates are coming! we need a {@link
|
* <p>The story of this implementation is this. <br>
|
||||||
* RowingBoat} to flee! We have a {@link FishingBoat} and our captain. We have no time to make up a
|
* Pirates are coming! we need a {@link RowingBoat} to flee! We have a {@link FishingBoat} and our
|
||||||
* new ship! we need to reuse this {@link FishingBoat}. The captain needs a rowing boat which he can
|
* captain. We have no time to make up a new ship! we need to reuse this {@link FishingBoat}. The
|
||||||
* operate. The spec is in {@link RowingBoat}. We will use the Adapter pattern to reuse {@link
|
* captain needs a rowing boat which he can operate. The spec is in {@link RowingBoat}. We will use
|
||||||
* FishingBoat}.
|
* the Adapter pattern to reuse {@link FishingBoat}.
|
||||||
*/
|
*/
|
||||||
public final class App {
|
public final class App {
|
||||||
|
|
||||||
private App() {
|
private App() {}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Program entry point.
|
* Program entry point.
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ import lombok.NoArgsConstructor;
|
|||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Captain uses {@link RowingBoat} to sail. <br> This is the client in the pattern.
|
* The Captain uses {@link RowingBoat} to sail. <br>
|
||||||
|
* This is the client in the pattern.
|
||||||
*/
|
*/
|
||||||
@Setter
|
@Setter
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@@ -41,5 +42,4 @@ public final class Captain {
|
|||||||
void row() {
|
void row() {
|
||||||
rowingBoat.row();
|
rowingBoat.row();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -36,5 +36,4 @@ final class FishingBoat {
|
|||||||
void sail() {
|
void sail() {
|
||||||
LOGGER.info("The fishing boat is sailing");
|
LOGGER.info("The fishing boat is sailing");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -25,10 +25,10 @@
|
|||||||
package com.iluwatar.adapter;
|
package com.iluwatar.adapter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The interface expected by the client.<br> A rowing boat is rowed to move.
|
* The interface expected by the client.<br>
|
||||||
|
* A rowing boat is rowed to move.
|
||||||
*/
|
*/
|
||||||
public interface RowingBoat {
|
public interface RowingBoat {
|
||||||
|
|
||||||
void row();
|
void row();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -24,17 +24,15 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.adapter;
|
package com.iluwatar.adapter;
|
||||||
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
/**
|
import java.util.HashMap;
|
||||||
* Tests for the adapter pattern.
|
import java.util.Map;
|
||||||
*/
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
/** Tests for the adapter pattern. */
|
||||||
class AdapterPatternTest {
|
class AdapterPatternTest {
|
||||||
|
|
||||||
private Map<String, Object> beans;
|
private Map<String, Object> beans;
|
||||||
@@ -43,9 +41,7 @@ class AdapterPatternTest {
|
|||||||
|
|
||||||
private static final String ROWING_BEAN = "captain";
|
private static final String ROWING_BEAN = "captain";
|
||||||
|
|
||||||
/**
|
/** This method runs before the test execution and sets the bean objects in the beans Map. */
|
||||||
* This method runs before the test execution and sets the bean objects in the beans Map.
|
|
||||||
*/
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void setup() {
|
void setup() {
|
||||||
beans = new HashMap<>();
|
beans = new HashMap<>();
|
||||||
|
|||||||
@@ -24,23 +24,17 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.adapter;
|
package com.iluwatar.adapter;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||||
|
|
||||||
/**
|
import org.junit.jupiter.api.Test;
|
||||||
* Tests that Adapter example runs without errors.
|
|
||||||
*/
|
/** Tests that Adapter example runs without errors. */
|
||||||
class AppTest {
|
class AppTest {
|
||||||
|
|
||||||
/**
|
/** Check whether the execution of the main method in {@link App} throws an exception. */
|
||||||
* Check whether the execution of the main method in {@link App}
|
|
||||||
* throws an exception.
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldExecuteApplicationWithoutException() {
|
void shouldExecuteApplicationWithoutException() {
|
||||||
|
|
||||||
assertDoesNotThrow(() -> App.main(new String[]{}));
|
assertDoesNotThrow(() -> App.main(new String[] {}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+84
-50
@@ -1,41 +1,49 @@
|
|||||||
---
|
---
|
||||||
title: Ambassador
|
title: "Ambassador Pattern in Java: Simplifying Remote Resource Management"
|
||||||
category: Structural
|
shortTitle: Ambassador
|
||||||
|
description: "Explore the Ambassador Pattern in Java, its benefits, use cases, and practical examples. Learn how to decouple and offload common functionalities to improve system performance and maintainability."
|
||||||
|
category: Integration
|
||||||
language: en
|
language: en
|
||||||
tag:
|
tag:
|
||||||
|
- API design
|
||||||
- Decoupling
|
- Decoupling
|
||||||
- Cloud distributed
|
- Fault tolerance
|
||||||
|
- Proxy
|
||||||
|
- Resilience
|
||||||
|
- Scalability
|
||||||
---
|
---
|
||||||
|
|
||||||
## Intent
|
## Intent of Ambassador Design Pattern
|
||||||
|
|
||||||
Provide a helper service instance on a client and offload common functionality away from a shared resource.
|
The Ambassador Pattern in Java helps offload common functionalities such as monitoring, logging, and routing from a shared resource to a helper service instance, enhancing performance and maintainability in distributed systems.
|
||||||
|
|
||||||
## Explanation
|
## Detailed Explanation of Ambassador Pattern with Real-World Examples
|
||||||
|
|
||||||
Real world example
|
Real-world example
|
||||||
|
|
||||||
> A remote service has many clients accessing a function it provides. The service is a legacy application and is
|
> Imagine a busy hotel where guests frequently request restaurant reservations, event tickets, or transportation arrangements. Instead of each guest individually contacting these services, the hotel provides a concierge. The concierge handles these tasks on behalf of the guests, ensuring that reservations are made smoothly, tickets are booked on time, and transportation is scheduled efficiently.
|
||||||
> impossible to update. Large numbers of requests from users are causing connectivity issues. New rules for request
|
>
|
||||||
> frequency should be implemented along with latency checks and client-side logging.
|
> In this analogy, the guests are the client services, the external providers (restaurants, ticket vendors, transportation) are the remote services, and the concierge represents the ambassador service. This setup allows the guests to focus on enjoying their stay while the concierge manages the complexities of external interactions, providing a seamless and enhanced experience.
|
||||||
|
|
||||||
In plain words
|
In plain words
|
||||||
|
|
||||||
> With the Ambassador pattern, we can implement less-frequent polling from clients along with latency checks and
|
> With the Ambassador pattern, we can implement less-frequent polling from clients along with latency checks and logging.
|
||||||
> logging.
|
|
||||||
|
|
||||||
Microsoft documentation states
|
Microsoft documentation states
|
||||||
|
|
||||||
> An ambassador service can be thought of as an out-of-process proxy which is co-located with the client. This pattern
|
> An ambassador service can be thought of as an out-of-process proxy which is co-located with the client. This pattern can be useful for offloading common client connectivity tasks such as monitoring, logging, routing, security (such as TLS), and resiliency patterns in a language agnostic way. It is often used with legacy applications, or other applications that are difficult to modify, in order to extend their networking capabilities. It can also enable a specialized team to implement those features.
|
||||||
> can be useful for offloading common client connectivity tasks such as monitoring, logging, routing,
|
|
||||||
> security (such as TLS), and resiliency patterns in a language agnostic way. It is often used with legacy applications,
|
|
||||||
> or other applications that are difficult to modify, in order to extend their networking capabilities. It can also
|
|
||||||
> enable a specialized team to implement those features.
|
|
||||||
|
|
||||||
**Programmatic Example**
|
Sequence diagram
|
||||||
|
|
||||||
With the above introduction in mind we will imitate the functionality in this example. We have an interface implemented
|

|
||||||
by the remote service as well as the ambassador service:
|
|
||||||
|
## Programmatic Example of Ambassador Pattern in Java
|
||||||
|
|
||||||
|
In this example of the Ambassador Pattern in Java, we demonstrate how to implement latency checks, logging, and retry mechanisms to improve system reliability.
|
||||||
|
|
||||||
|
A remote service has many clients accessing a function it provides. The service is a legacy application and is impossible to update. Large numbers of requests from users are causing connectivity issues. New rules for request frequency should be implemented along with latency checks and client-side logging.
|
||||||
|
|
||||||
|
With the above introduction in mind we will imitate the functionality in this example. We have an interface implemented by the remote service as well as the ambassador service.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
interface RemoteServiceInterface {
|
interface RemoteServiceInterface {
|
||||||
@@ -46,6 +54,7 @@ interface RemoteServiceInterface {
|
|||||||
A remote services represented as a singleton.
|
A remote services represented as a singleton.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class RemoteService implements RemoteServiceInterface {
|
public class RemoteService implements RemoteServiceInterface {
|
||||||
private static RemoteService service = null;
|
private static RemoteService service = null;
|
||||||
@@ -57,7 +66,8 @@ public class RemoteService implements RemoteServiceInterface {
|
|||||||
return service;
|
return service;
|
||||||
}
|
}
|
||||||
|
|
||||||
private RemoteService() {}
|
private RemoteService() {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long doRemoteFunction(int value) {
|
public long doRemoteFunction(int value) {
|
||||||
@@ -74,9 +84,10 @@ public class RemoteService implements RemoteServiceInterface {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
A service ambassador adding additional features such as logging, latency checks
|
A service ambassador adds additional features such as logging and latency checks.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class ServiceAmbassador implements RemoteServiceInterface {
|
public class ServiceAmbassador implements RemoteServiceInterface {
|
||||||
private static final int RETRIES = 3;
|
private static final int RETRIES = 3;
|
||||||
@@ -125,9 +136,10 @@ public class ServiceAmbassador implements RemoteServiceInterface {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
A client has a local service ambassador used to interact with the remote service:
|
A client has a local service ambassador used to interact with the remote service.
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class Client {
|
public class Client {
|
||||||
private final ServiceAmbassador serviceAmbassador = new ServiceAmbassador();
|
private final ServiceAmbassador serviceAmbassador = new ServiceAmbassador();
|
||||||
@@ -156,31 +168,24 @@ public class App {
|
|||||||
Here's the output for running the example:
|
Here's the output for running the example:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Time taken (ms): 111
|
Time taken(ms):111
|
||||||
Service result: 120
|
Service result:120
|
||||||
Time taken (ms): 931
|
Time taken(ms):931
|
||||||
Failed to reach remote: (1)
|
Failed to reach remote:(1)
|
||||||
Time taken (ms): 665
|
Time taken(ms):665
|
||||||
Failed to reach remote: (2)
|
Failed to reach remote:(2)
|
||||||
Time taken (ms): 538
|
Time taken(ms):538
|
||||||
Failed to reach remote: (3)
|
Failed to reach remote:(3)
|
||||||
Service result: -1
|
Service result:-1
|
||||||
```
|
```
|
||||||
|
|
||||||
## Class diagram
|
## When to Use the Ambassador Pattern in Java
|
||||||
|
|
||||||

|
* The Ambassador Pattern is particularly beneficial for Cloud Native and Microservices Architectures in Java. It helps in monitoring, logging, and securing inter-service communication, making it ideal for distributed systems.
|
||||||
|
* Legacy System Integration: Facilitates communication with newer services by handling necessary but non-core functionalities.
|
||||||
|
* Performance Enhancement: Can be used to cache results or compress data to improve communication efficiency.
|
||||||
|
|
||||||
## Applicability
|
Typical use cases include:
|
||||||
|
|
||||||
Ambassador is applicable when working with a legacy remote service which cannot be modified or would be extremely
|
|
||||||
difficult to modify. Connectivity features can be implemented on the client avoiding the need for changes on the remote
|
|
||||||
service.
|
|
||||||
|
|
||||||
* Ambassador provides a local interface for a remote service.
|
|
||||||
* Ambassador provides logging, circuit breaking, retries and security on the client.
|
|
||||||
|
|
||||||
## Typical Use Case
|
|
||||||
|
|
||||||
* Control access to another object
|
* Control access to another object
|
||||||
* Implement logging
|
* Implement logging
|
||||||
@@ -188,15 +193,44 @@ service.
|
|||||||
* Offload remote service tasks
|
* Offload remote service tasks
|
||||||
* Facilitate network connection
|
* Facilitate network connection
|
||||||
|
|
||||||
## Known uses
|
## Benefits and Trade-offs of Ambassador Pattern
|
||||||
|
|
||||||
|
Benefits:
|
||||||
|
|
||||||
|
* Separation of Concerns: Offloads cross-cutting concerns from the service logic, leading to cleaner, more maintainable code.
|
||||||
|
* Reusable Infrastructure Logic: The ambassador pattern allows the same logic (e.g., logging, monitoring) to be reused across multiple services.
|
||||||
|
* Improved Security: Centralizes security features like SSL termination or authentication, reducing the risk of misconfiguration.
|
||||||
|
* Flexibility: Makes it easier to update or replace infrastructure concerns without modifying the service code.
|
||||||
|
|
||||||
|
Trade-offs:
|
||||||
|
|
||||||
|
* Increased Complexity: Adds another layer to the architecture, which can complicate the system design and debugging.
|
||||||
|
* Potential Performance Overhead: The additional network hop can introduce latency and overhead, particularly if not optimized.
|
||||||
|
* Deployment Overhead: Requires additional resources and management for deploying and scaling ambassador services.
|
||||||
|
|
||||||
|
## Real-World Applications of Ambassador Pattern in Java
|
||||||
|
|
||||||
|
* Service Mesh Implementations: In a service mesh architecture, like Istio or Linkerd, the Ambassador pattern is often employed as a sidecar proxy that handles inter-service communications. This includes tasks such as service discovery, routing, load balancing, telemetry (metrics and tracing), and security (authentication and authorization).
|
||||||
|
* API Gateways: API gateways can use the Ambassador pattern to encapsulate common functionalities like rate limiting, caching, request shaping, and authentication. This allows backend services to focus on their core business logic without being burdened by these cross-cutting concerns.
|
||||||
|
* Logging and Monitoring: An Ambassador can aggregate logs and metrics from various services and forward them to centralized monitoring tools like Prometheus or ELK Stack (Elasticsearch, Logstash, Kibana). This simplifies the logging and monitoring setup for each service and provides a unified view of the system's health.
|
||||||
|
* Security: Security-related functionalities such as SSL/TLS termination, identity verification, and encryption can be managed by an Ambassador. This ensures consistent security practices across services and reduces the likelihood of security breaches due to misconfigurations.
|
||||||
|
* Resilience: The Ambassador can implement resilience patterns like circuit breakers, retries, and timeouts. For instance, Netflix's Hystrix library can be used within an Ambassador to prevent cascading failures in a microservices ecosystem.
|
||||||
|
* Database Proxy: Ambassadors can act as proxies for database connections, providing functionalities like connection pooling, read/write splitting for replicas, and query caching. This offloads significant complexity from the application services.
|
||||||
|
* Legacy System Integration: In scenarios where modern microservices need to communicate with legacy systems, an Ambassador can serve as an intermediary that translates protocols, handles necessary transformations, and implements modern security practices, easing the integration process.
|
||||||
|
* Network Optimization: For services deployed across different geographical locations or cloud regions, Ambassadors can optimize communication by compressing data, batching requests, or even implementing smart routing to reduce latency and costs.
|
||||||
* [Kubernetes-native API gateway for microservices](https://github.com/datawire/ambassador)
|
* [Kubernetes-native API gateway for microservices](https://github.com/datawire/ambassador)
|
||||||
|
|
||||||
## Related patterns
|
## Related Java Design Patterns
|
||||||
|
|
||||||
* [Proxy](https://java-design-patterns.com/patterns/proxy/)
|
* [Circuit Breaker](https://java-design-patterns.com/patterns/circuit-breaker/): Often used in conjunction to manage fault tolerance by stopping calls to an unresponsive service.
|
||||||
|
* [Decorator](https://java-design-patterns.com/patterns/decorator/): The decorator pattern is used to add functionality to an object dynamically, while the ambassador pattern is used to offload functionality to a separate object.
|
||||||
|
* [Proxy](https://java-design-patterns.com/patterns/proxy/): Shares similarities with the proxy pattern, but the ambassador pattern specifically focuses on offloading ancillary functionalities.
|
||||||
|
* Sidecar: A similar pattern used in the context of containerized applications, where a sidecar container provides additional functionality to the main application container.
|
||||||
|
|
||||||
## Credits
|
## References and Credits
|
||||||
|
|
||||||
* [Ambassador pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/ambassador)
|
* [Building Microservices: Designing Fine-Grained Systems](https://amzn.to/43aGpSR)
|
||||||
* [Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services](https://www.amazon.com/s?k=designing+distributed+systems&sprefix=designing+distri%2Caps%2C156&linkCode=ll2&tag=javadesignpat-20&linkId=a12581e625462f9038557b01794e5341&language=en_US&ref_=as_li_ss_tl)
|
* [Cloud Native Patterns: Designing Change-tolerant Software](https://amzn.to/3wUAl4O)
|
||||||
|
* [Designing Distributed Systems: Patterns and Paradigms for Scalable, Reliable Services](https://amzn.to/3T9g9Uj)
|
||||||
|
* [Microservices Patterns: With examples in Java](https://amzn.to/3UyWD5O)
|
||||||
|
* [Ambassador pattern (Microsoft)](https://docs.microsoft.com/en-us/azure/architecture/patterns/ambassador)
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
@@ -34,6 +34,14 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>ambassador</artifactId>
|
<artifactId>ambassador</artifactId>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter-engine</artifactId>
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ package com.iluwatar.ambassador;
|
|||||||
* The ambassador pattern creates a helper service that sends network requests on behalf of a
|
* The ambassador pattern creates a helper service that sends network requests on behalf of a
|
||||||
* client. It is often used in cloud-based applications to offload features of a remote service.
|
* client. It is often used in cloud-based applications to offload features of a remote service.
|
||||||
*
|
*
|
||||||
* <p>An ambassador service can be thought of as an out-of-process proxy that is co-located with
|
* <p>An ambassador service can be thought of as an out-of-process proxy that is co-located with the
|
||||||
* the client. Similar to the proxy design pattern, the ambassador service provides an interface for
|
* client. Similar to the proxy design pattern, the ambassador service provides an interface for
|
||||||
* another remote service. In addition to the interface, the ambassador provides extra functionality
|
* another remote service. In addition to the interface, the ambassador provides extra functionality
|
||||||
* and features, specifically offloaded common connectivity tasks. This usually consists of
|
* and features, specifically offloaded common connectivity tasks. This usually consists of
|
||||||
* monitoring, logging, routing, security etc. This is extremely useful in legacy applications where
|
* monitoring, logging, routing, security etc. This is extremely useful in legacy applications where
|
||||||
@@ -37,14 +37,11 @@ package com.iluwatar.ambassador;
|
|||||||
* capabilities.
|
* capabilities.
|
||||||
*
|
*
|
||||||
* <p>In this example, we will the ({@link ServiceAmbassador}) class represents the ambassador while
|
* <p>In this example, we will the ({@link ServiceAmbassador}) class represents the ambassador while
|
||||||
* the
|
* the ({@link RemoteService}) class represents a remote application.
|
||||||
* ({@link RemoteService}) class represents a remote application.
|
|
||||||
*/
|
*/
|
||||||
public class App {
|
public class App {
|
||||||
|
|
||||||
/**
|
/** Entry point. */
|
||||||
* Entry point.
|
|
||||||
*/
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
var host1 = new Client();
|
var host1 = new Client();
|
||||||
var host2 = new Client();
|
var host2 = new Client();
|
||||||
|
|||||||
@@ -26,9 +26,7 @@ package com.iluwatar.ambassador;
|
|||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
/**
|
/** A simple Client. */
|
||||||
* A simple Client.
|
|
||||||
*/
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class Client {
|
public class Client {
|
||||||
|
|
||||||
|
|||||||
@@ -29,9 +29,7 @@ import static java.lang.Thread.sleep;
|
|||||||
import com.iluwatar.ambassador.util.RandomProvider;
|
import com.iluwatar.ambassador.util.RandomProvider;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
/**
|
/** A remote legacy application represented by a Singleton implementation. */
|
||||||
* A remote legacy application represented by a Singleton implementation.
|
|
||||||
*/
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class RemoteService implements RemoteServiceInterface {
|
public class RemoteService implements RemoteServiceInterface {
|
||||||
private static final int THRESHOLD = 200;
|
private static final int THRESHOLD = 200;
|
||||||
@@ -49,9 +47,7 @@ public class RemoteService implements RemoteServiceInterface {
|
|||||||
this(Math::random);
|
this(Math::random);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** This constructor is used for testing purposes only. */
|
||||||
* This constructor is used for testing purposes only.
|
|
||||||
*/
|
|
||||||
RemoteService(RandomProvider randomProvider) {
|
RemoteService(RandomProvider randomProvider) {
|
||||||
this.randomProvider = randomProvider;
|
this.randomProvider = randomProvider;
|
||||||
}
|
}
|
||||||
@@ -75,7 +71,8 @@ public class RemoteService implements RemoteServiceInterface {
|
|||||||
LOGGER.error("Thread sleep state interrupted", e);
|
LOGGER.error("Thread sleep state interrupted", e);
|
||||||
Thread.currentThread().interrupt();
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
return waitTime <= THRESHOLD ? value * 10
|
return waitTime <= THRESHOLD
|
||||||
|
? value * 10
|
||||||
: RemoteServiceStatus.FAILURE.getRemoteServiceStatusValue();
|
: RemoteServiceStatus.FAILURE.getRemoteServiceStatusValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -24,9 +24,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.ambassador;
|
package com.iluwatar.ambassador;
|
||||||
|
|
||||||
/**
|
/** Interface shared by ({@link RemoteService}) and ({@link ServiceAmbassador}). */
|
||||||
* Interface shared by ({@link RemoteService}) and ({@link ServiceAmbassador}).
|
|
||||||
*/
|
|
||||||
interface RemoteServiceInterface {
|
interface RemoteServiceInterface {
|
||||||
|
|
||||||
long doRemoteFunction(int value);
|
long doRemoteFunction(int value);
|
||||||
|
|||||||
@@ -24,25 +24,21 @@
|
|||||||
*/
|
*/
|
||||||
package com.iluwatar.ambassador;
|
package com.iluwatar.ambassador;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds information regarding the status of the Remote Service.
|
* Holds information regarding the status of the Remote Service.
|
||||||
*
|
*
|
||||||
* <p> This Enum replaces the integer value previously
|
* <p>This Enum replaces the integer value previously stored in {@link RemoteServiceInterface} as
|
||||||
* stored in {@link RemoteServiceInterface} as SonarCloud was identifying
|
* SonarCloud was identifying it as an issue. All test cases have been checked after changes,
|
||||||
* it as an issue. All test cases have been checked after changes,
|
* without failures.
|
||||||
* without failures. </p>
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public enum RemoteServiceStatus {
|
public enum RemoteServiceStatus {
|
||||||
FAILURE(-1);
|
FAILURE(-1);
|
||||||
|
|
||||||
private final long remoteServiceStatusValue;
|
@Getter private final long remoteServiceStatusValue;
|
||||||
|
|
||||||
RemoteServiceStatus(long remoteServiceStatusValue) {
|
RemoteServiceStatus(long remoteServiceStatusValue) {
|
||||||
this.remoteServiceStatusValue = remoteServiceStatusValue;
|
this.remoteServiceStatusValue = remoteServiceStatusValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getRemoteServiceStatusValue() {
|
|
||||||
return remoteServiceStatusValue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -40,8 +40,7 @@ public class ServiceAmbassador implements RemoteServiceInterface {
|
|||||||
private static final int RETRIES = 3;
|
private static final int RETRIES = 3;
|
||||||
private static final int DELAY_MS = 3000;
|
private static final int DELAY_MS = 3000;
|
||||||
|
|
||||||
ServiceAmbassador() {
|
ServiceAmbassador() {}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long doRemoteFunction(int value) {
|
public long doRemoteFunction(int value) {
|
||||||
|
|||||||
Loaded 100 of 3277 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user