我正在构建一个增强现实 iPhone 应用程序,它需要渲染大量的 SceneKit 节点。我想集成Gamma、Helm、Johnson 和 Vlissides在设计模式中描述的享元设计模式。也是这里的教程Flyweight Design Pattern 但是,我遇到了实现以及 Swift 如何处理对象的问题。
TL;DR:在 Swift 中有没有一种方法可以让我不止一次地将它添加SCNNode
到 a中,并让它显示在不同的位置?ARSCNView
我有一个名为的类Box
,它构建SCNBox
了我想利用 Flyweight 的 s;a的内在状态是Box
维度。外在状态是它的颜色和位置。
盒子类
class Box {
var size:CGFloat
var position:(Float, Float, Float)
var color:UIColor
var node:SCNNode!
init(color:UIColor){
self.color = color
/*Set the following below as default values*/
self.size = CGFloat(0.05) //Side length
self.position = (0,0,0)
self.createBox()
}
private func createBox() -> Void {
/*Creating box and setting its color*/
self.node = SCNNode(geometry: SCNBox(width: size, height: size, length: size, chamferRadius: 0))
self.node.geometry?.firstMaterial?.diffuse.contents = self.color
}
func draw(sceneView: ARSCNView) -> Void {
sceneView.scene.rootNode.addChildNode(self.node)
}
}
我有一个工厂类,它使用字典来实现设计,检查以前的对象是否相同颜色,如果是,则重用该对象,否则创建一个新对象。
工厂类
class BoxFactory{
var hash:[UIColor:Box] = [UIColor:Box]()
func getBox(color c:UIColor) -> Box {
/*Check if box of color c already exists*/
if(self.hash[c] != nil){
return self.hash[c]!
}
/*Create a new box if it does not*/
let b:Box = Box(color: c)
self.hash[c] = b
return b
}
}
还有一些视图控制器持有一个ARSCNView
对象来显示这些框。
let factory:BoxFactory = BoxFactory()
/*Create two boxes of same color. One on the left and on the right*/
let leftBox:Box = factory.getBox(color: UIColor.green)
leftBox.position = SCNVector3(-0.1,0,0)
leftBox.draw(sceneView: self.sceneView)
let rightBox:Box = factory.getBox(color: UIColor.green)
rightBox.position = SCNVector3(0.1,0,0)
rightBox.draw(sceneView: self.sceneView)
但是,这只会产生一个绿色框;正确的那一个。第二个getBox()
调用覆盖第一个位置Image below。对于这种模式或 Swift 的实现,是否有人有任何建议可以帮助实现这种对象重用模式?
*旁注:我不需要散列对象的位置及其颜色。因为我会有许多Box
不同颜色和位置的 es ,它会破坏重用同一个对象的整个想法。