File tree Expand file tree Collapse file tree 7 files changed +142
-1
lines changed
src/main/java/com/phint2/pattern/structural/flyweight Expand file tree Collapse file tree 7 files changed +142
-1
lines changed Original file line number Diff line number Diff line change @@ -62,3 +62,8 @@ Reference: https://gpcoder.com/4574-huong-dan-java-design-pattern-decorator/
6262### Facade
6363
6464Reference: https://gpcoder.com/4604-huong-dan-java-design-pattern-facade/
65+
66+ ### Flyweight
67+
68+ Reference: https://gpcoder.com/4626-huong-dan-java-design-pattern-flyweight/
69+ Review: Good for create character in game
Original file line number Diff line number Diff line change 66
77 <groupId >com.phint2</groupId >
88 <artifactId >design-pattern</artifactId >
9- <version >2.4 .0</version >
9+ <version >2.5 .0</version >
1010
1111 <properties >
1212 <maven .compiler.source>8</maven .compiler.source>
Original file line number Diff line number Diff line change 1+ package com .phint2 .pattern .structural .flyweight ;
2+
3+ import java .time .Duration ;
4+ import java .util .ArrayList ;
5+ import java .util .List ;
6+
7+ /*
8+ * Client
9+ * */
10+ public class AppGame {
11+
12+ private static List <ISoldier > soldiers = new ArrayList <>();
13+
14+ public static void main (String [] args ) {
15+ long startTime = System .currentTimeMillis ();
16+ createSoldier (5 , "Yuri" , 1 );
17+ createSoldier (5 , "Spy" , 1 );
18+ createSoldier (3 , "Spy" , 3 );
19+ createSoldier (2 , "Yuri" , 2 );
20+ long endTime = System .currentTimeMillis ();
21+ System .out .println ("---" );
22+ System .out .println ("Total soldiers made: " + soldiers .size ());
23+ System .out .println ("Total time worked: " + Duration .ofMillis (endTime - startTime ));
24+ System .out .println ("Total type of soldiers made: " + SoldierFactory .getTotalSoldiers ());
25+ }
26+
27+ private static void createSoldier (int numberOfSoldier , String soldierName , int numberOfStart ) {
28+
29+ for (int i = 0 ; i < numberOfSoldier ; i ++) {
30+ Context start = new Context ("Soldier" + (soldiers .size () + 1 ), numberOfStart );
31+ ISoldier soldier = SoldierFactory .createSoldier (soldierName );
32+ soldier .promote (start );
33+ soldiers .add (soldier );
34+ }
35+ }
36+ }
37+
38+
39+
40+
41+
42+
43+
44+
45+
46+
47+
Original file line number Diff line number Diff line change 1+ package com .phint2 .pattern .structural .flyweight ;
2+
3+ /*
4+ * Extrinsic State
5+ * */
6+ public class Context {
7+
8+ private String id ;
9+ private int start ;
10+
11+ public Context (String id , int start ) {
12+ this .id = id ;
13+ this .start = start ;
14+ }
15+
16+ public String getId () {
17+ return id ;
18+ }
19+
20+ public int getStart () {
21+ return start ;
22+ }
23+ }
Original file line number Diff line number Diff line change 1+ package com .phint2 .pattern .structural .flyweight ;
2+
3+ /*
4+ * Flyweight
5+ * */
6+ public interface ISoldier {
7+
8+ void promote (Context context );
9+ }
Original file line number Diff line number Diff line change 1+ package com .phint2 .pattern .structural .flyweight ;
2+
3+ /*
4+ * Concrete Flyweight
5+ * */
6+ public class Soldier implements ISoldier {
7+
8+ private final String name ; // Intrinsic State
9+
10+ public Soldier (String name ) {
11+ this .name = name ;
12+ System .out .println ("Solider is created! - " + name );
13+ }
14+
15+ @ Override
16+ public void promote (Context context ) {
17+ System .out .println (name + " " + context .getId () + " promoted " + context .getStart ());
18+ }
19+ }
Original file line number Diff line number Diff line change 1+ package com .phint2 .pattern .structural .flyweight ;
2+
3+ import java .util .HashMap ;
4+ import java .util .Map ;
5+
6+ /*
7+ * Flyweight Factory
8+ * */
9+ public class SoldierFactory {
10+
11+ private static final Map <String , ISoldier > soldiers = new HashMap <>();
12+
13+ private SoldierFactory () {
14+ throw new IllegalStateException ();
15+ }
16+
17+ public static synchronized ISoldier createSoldier (String name ) {
18+ ISoldier soldier = soldiers .get (name );
19+ if (null == soldier ) {
20+ waitForCreateASoldier ();
21+ soldier = new Soldier (name );
22+ soldiers .put (name , soldier );
23+ }
24+ return soldier ;
25+ }
26+
27+ public static synchronized int getTotalSoldiers () {
28+ return soldiers .size ();
29+ }
30+
31+ private static void waitForCreateASoldier () {
32+ try {
33+ Thread .sleep (3000 );
34+ } catch (InterruptedException e ) {
35+ e .printStackTrace ();
36+ }
37+ }
38+ }
You can’t perform that action at this time.
0 commit comments