Created
July 17, 2023 21:13
-
-
Save ulkomar/f981f2eee77c3bc46269ea615942ddd7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
enum TreeType: String, CaseIterable { | |
case oak = "Oak" | |
case birch = "Birch" | |
case aspen = "Aspen" | |
} | |
final class Tree { | |
let leafColor: UIColor | |
let leafImage: UIImage | |
let rootColor: UIColor | |
let rootImage: UIImage | |
let height: Int | |
let treeType: TreeType | |
init(leafColor: UIColor, leafImage: UIImage, rootColor: UIColor, rootImage: UIImage, height: Int, treeType: TreeType) { | |
self.leafColor = leafColor | |
self.leafImage = leafImage | |
self.rootColor = rootColor | |
self.rootImage = rootImage | |
self.treeType = treeType | |
self.height = height | |
} | |
} | |
final class TreeSprite { | |
let leafColor: UIColor | |
let leafImage: UIImage | |
let rootColor: UIColor | |
let rootImage: UIImage | |
let treeType: TreeType | |
init(leafColor: UIColor, leafImage: UIImage, rootColor: UIColor, rootImage: UIImage, treeType: TreeType) { | |
self.leafColor = leafColor | |
self.leafImage = leafImage | |
self.rootColor = rootColor | |
self.rootImage = rootImage | |
self.treeType = treeType | |
} | |
func checkMemoryIndex() { | |
// Просто проверяем по какому индексу в памяти находится объект | |
let memoryAddress = Unmanaged<TreeSprite>.passUnretained(self).toOpaque() | |
print(memoryAddress) | |
} | |
} | |
final class TreeFactory { | |
// Store of all sprites | |
static var spriteTree = [TreeType:TreeSprite]() | |
// Factory of creating a new sprite | |
static func getSpriteTree(of type: TreeType) -> TreeSprite { | |
if let tree = spriteTree[type] { | |
return tree | |
} else { | |
var tree: TreeSprite | |
switch type { | |
case .oak: | |
tree = TreeSprite(leafColor: .black, leafImage: .init(), rootColor: .black, rootImage: .init(), treeType: .oak) | |
case .birch: | |
tree = TreeSprite(leafColor: .green, leafImage: .init(), rootColor: .brown, rootImage: .init(), treeType: .birch) | |
case .aspen: | |
tree = TreeSprite(leafColor: .lightGray, leafImage: .init(), rootColor: .brown, rootImage: .init(), treeType: .birch) | |
} | |
spriteTree[type] = tree | |
return tree | |
} | |
} | |
} | |
final class ConcreteTree { | |
let height: Int | |
let sprite: TreeSprite | |
init(height: Int, treeSprite: TreeSprite) { | |
self.height = height | |
self.sprite = treeSprite | |
} | |
func checkSpriteIndex() { | |
sprite.checkMemoryIndex() | |
} | |
} | |
final class TreeManager { | |
func create1000LightTrees() { | |
var allTrees = [ConcreteTree]() | |
for index in 1...1000 { | |
let randomCase = TreeType.allCases.randomElement() | |
let spriteTree = TreeFactory.getSpriteTree(of: randomCase!) | |
let tree = ConcreteTree(height: index + 1000, treeSprite: spriteTree) | |
tree.checkSpriteIndex() | |
allTrees.append(tree) | |
} | |
print(self.size(allTrees)) | |
} | |
func create1000SimpleTrees() { | |
var allTrees = [Tree]() | |
for index in 1...1000 { | |
let randomCase = TreeType.allCases.randomElement() | |
let tree = Tree(leafColor: .green, leafImage: .init(), rootColor: .brown, rootImage: .init(), height: index + 1000, treeType: randomCase!) | |
allTrees.append(tree) | |
} | |
print(self.size(allTrees)) | |
} | |
private func size<T: AnyObject>(_ array: [T]) -> Int { | |
return class_getInstanceSize(T.self) * array.count | |
} | |
} | |
let treeManager = TreeManager() | |
treeManager.create1000LightTrees() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment