Skip to content

Commit 9aa468f

Browse files
committed
Improving flyweight with more memory efficency
1 parent b11a283 commit 9aa468f

3 files changed

Lines changed: 36 additions & 13 deletions

File tree

src/main/kotlin/oop/Flyweight/Flyweight.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ fun main(args: Array<String>) {
88
)
99

1010
val soldiersAttacks = SoldierClient(SoldierFactory(soldiers))
11-
soldiersAttacks.attack("Pedro", Point(1,2))
12-
soldiersAttacks.attack("Ryan", Point(10,12))
13-
soldiersAttacks.attack("Ryan", Point(13,2))
14-
soldiersAttacks.attack("Forest", Point(133,233))
15-
soldiersAttacks.attack("Pedro", Point(1,1))
16-
soldiersAttacks.attack("Pedro", Point(2,2))
17-
soldiersAttacks.attack("Pedro", Point(44,5))
11+
soldiersAttacks.attack("Pedro", 1, 2)
12+
soldiersAttacks.attack("Ryan", 10, 12)
13+
soldiersAttacks.attack("Ryan", 13, 2)
14+
soldiersAttacks.attack("Forest", 1, 2)
15+
soldiersAttacks.attack("Pedro", 1, 2)
16+
soldiersAttacks.attack("Pedro", 10, 12)
17+
soldiersAttacks.attack("Pedro", 44, 5)
1818

1919
soldiersAttacks.attacks.forEach(::println)
2020
}

src/main/kotlin/oop/Flyweight/Soldier.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ data class Point(val x: Int, val y: Int)
44

55
data class Soldier(val name: String)
66

7-
class SoldierFactory(private val soldiers: MutableList<Soldier> = mutableListOf()) {
7+
class SoldierFactory(private val soldiers: MutableList<Soldier> = mutableListOf(),
8+
private val points: MutableList<Point> = mutableListOf()) {
89

910
fun getSoldier(name: String): Soldier {
1011
if (!soldiers.map { it.name }.contains(name)) {
@@ -14,6 +15,15 @@ class SoldierFactory(private val soldiers: MutableList<Soldier> = mutableListOf(
1415
return soldiers.filter { it.name == name }.first()
1516
}
1617

18+
fun getPoint(x: Int, y: Int): Point {
19+
var point = Point(x, y)
20+
if (!points.contains(point)) {
21+
points.add(point)
22+
}
23+
24+
return points.filter { it == point }.first()
25+
}
26+
1727
}
1828

1929
data class Attack(val soldier: Soldier, val point: Point) {
@@ -23,10 +33,11 @@ data class Attack(val soldier: Soldier, val point: Point) {
2333
}
2434

2535
class SoldierClient(private val soldierFactory: SoldierFactory,
26-
val attacks : MutableList<Attack> = mutableListOf<Attack>()) {
36+
val attacks: MutableList<Attack> = mutableListOf<Attack>()) {
2737

28-
fun attack(soldierName: String, point: Point) {
38+
fun attack(soldierName: String, x: Int, y: Int) {
2939
val soldier = soldierFactory.getSoldier(soldierName)
40+
val point = soldierFactory.getPoint(x, y)
3041
attacks.add(Attack(soldier, point))
3142
}
3243

src/test/kotlin/oop/Flyweigth/FlyweightPatternShould.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ class FlyweightPatternShould {
1515
val soldiers = mutableListOf<Soldier>()
1616
val soldiersAttack = SoldierClient(SoldierFactory(soldiers))
1717

18-
soldiersAttack.attack("Pedro", Point(1, 2))
19-
soldiersAttack.attack("Pedro", Point(2, 2))
20-
soldiersAttack.attack("Pedro", Point(3, 5))
18+
soldiersAttack.attack("Pedro", 1, 2)
19+
soldiersAttack.attack("Pedro", 2, 2)
20+
soldiersAttack.attack("Pedro", 2, 2)
2121

2222
assertThat(soldiers.filter { it.name == "Pedro" }.size, `is`(1))
2323
}
@@ -42,4 +42,16 @@ class FlyweightPatternShould {
4242

4343
assertTrue(soldierOne === soldierTwo)
4444
}
45+
46+
@Test
47+
fun `Have one instance of points when only one instance of point is created`() {
48+
val points = mutableListOf<Point>()
49+
val soldiersAttack = SoldierClient(SoldierFactory(points = points))
50+
51+
soldiersAttack.attack("Pedro", 3, 3)
52+
soldiersAttack.attack("Forest", 3, 3)
53+
soldiersAttack.attack("Forest", 3, 3)
54+
55+
assertThat(points.size, `is`(1))
56+
}
4557
}

0 commit comments

Comments
 (0)