Skip to content

Commit b11a283

Browse files
committed
Refactor flyweight
1 parent f398035 commit b11a283

7 files changed

Lines changed: 63 additions & 132 deletions

File tree

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

Lines changed: 0 additions & 19 deletions
This file was deleted.

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

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,20 @@
11
package oop.Flyweight
22

3-
import java.awt.Point
4-
class Flyweight{
5-
companion object{
6-
var objectInstances = 0
7-
}
8-
}
93
fun main(args: Array<String>) {
10-
val soldiers = listOf(
11-
SoldierClient(Admiral.TYPE),
12-
SoldierClient(Admiral.TYPE),
13-
SoldierClient(Captain.TYPE),
14-
SoldierClient(Captain.TYPE),
15-
SoldierClient(Admiral.TYPE),
16-
SoldierClient(Admiral.TYPE)
4+
val soldiers = mutableListOf(
5+
Soldier("Pedro"),
6+
Soldier("Ryan"),
7+
Soldier("Forest")
178
)
18-
soldiers[0].attack(Point(1,2))
19-
soldiers[1].attack(Point(10,12))
20-
soldiers[2].attack(Point(9,5))
21-
soldiers[3].attack(Point(11,7))
22-
soldiers[4].attack(Point(21,3))
239

24-
System.out.println(Flyweight.objectInstances)
10+
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))
2518

19+
soldiersAttacks.attacks.forEach(::println)
2620
}
Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,33 @@
11
package oop.Flyweight
22

3-
import java.awt.Point
3+
data class Point(val x: Int, val y: Int)
4+
5+
data class Soldier(val name: String)
6+
7+
class SoldierFactory(private val soldiers: MutableList<Soldier> = mutableListOf()) {
8+
9+
fun getSoldier(name: String): Soldier {
10+
if (!soldiers.map { it.name }.contains(name)) {
11+
soldiers.add(Soldier(name))
12+
}
13+
14+
return soldiers.filter { it.name == name }.first()
15+
}
16+
17+
}
18+
19+
data class Attack(val soldier: Soldier, val point: Point) {
20+
override fun toString(): String {
21+
return "$soldier attack ${point.x},${point.y} point"
22+
}
23+
}
24+
25+
class SoldierClient(private val soldierFactory: SoldierFactory,
26+
val attacks : MutableList<Attack> = mutableListOf<Attack>()) {
27+
28+
fun attack(soldierName: String, point: Point) {
29+
val soldier = soldierFactory.getSoldier(soldierName)
30+
attacks.add(Attack(soldier, point))
31+
}
432

5-
interface Soldier {
6-
fun attack(currentPosition: Point, attackPosition: Point)
733
}

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

Lines changed: 0 additions & 17 deletions
This file was deleted.

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

Lines changed: 0 additions & 36 deletions
This file was deleted.
Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package oop.Flyweigth
22

3+
import junit.framework.Assert.assertTrue
34
import oop.Flyweight.*
45
import org.hamcrest.CoreMatchers.`is`
56
import org.hamcrest.MatcherAssert.assertThat
@@ -9,35 +10,36 @@ import java.util.*
910

1011
class FlyweightPatternShould {
1112

12-
@Before
13-
fun initTests(){
14-
Flyweight.objectInstances = 0
15-
SoldierFactory.clearInstances()
16-
}
17-
1813
@Test
1914
fun `Have one instance when only one type of soldier is created`() {
20-
SoldierClient(Admiral.TYPE)
21-
SoldierClient(Admiral.TYPE)
22-
SoldierClient(Admiral.TYPE)
15+
val soldiers = mutableListOf<Soldier>()
16+
val soldiersAttack = SoldierClient(SoldierFactory(soldiers))
2317

24-
assertThat(Flyweight.objectInstances, `is`(1))
18+
soldiersAttack.attack("Pedro", Point(1, 2))
19+
soldiersAttack.attack("Pedro", Point(2, 2))
20+
soldiersAttack.attack("Pedro", Point(3, 5))
21+
22+
assertThat(soldiers.filter { it.name == "Pedro" }.size, `is`(1))
2523
}
24+
2625
@Test
27-
fun `Have two instances when both types are created, no matter the number of soldiers`(){
28-
(1..Random().nextInt(30)).forEach {
29-
SoldierClient(Admiral.TYPE)
30-
SoldierClient(Captain.TYPE)
26+
fun `Have two instances when both types are created, no matter the number of soldiers`() {
27+
val soldiers = mutableListOf<Soldier>()
28+
val soldierFactory = SoldierFactory(soldiers)
29+
(1..1000).forEach {
30+
soldierFactory.getSoldier("Pedro")
31+
soldierFactory.getSoldier("Ryan")
3132
}
3233

33-
assertThat(Flyweight.objectInstances, `is`(2))
34+
assertThat(soldiers.size, `is`(2))
3435
}
3536

3637
@Test
37-
fun `Have the same main object in two instances of the same type`(){
38-
val soldierOne: SoldierClient = SoldierClient(Admiral.TYPE)
39-
val soldierTwo: SoldierClient = SoldierClient(Admiral.TYPE)
38+
fun `Have the same main object in two instances of the same type`() {
39+
val soldierFactory = SoldierFactory()
40+
val soldierOne = soldierFactory.getSoldier("Pedro")
41+
val soldierTwo = soldierFactory.getSoldier("Pedro")
4042

41-
assertThat(soldierOne.getSoldier(), `is`(soldierTwo.getSoldier()))
43+
assertTrue(soldierOne === soldierTwo)
4244
}
4345
}

0 commit comments

Comments
 (0)