2015-08-09 33 views

回答

3

Doctrine 2的类型系统由flyweights组成,这意味着 只有一个给定类型的实例。

Flyweight类创建不可变的值对象。因此,它们与字符串类似,即

$String = "myString"; 

这创建了一个无法更改的String对象。对此的任何更改都会导致新的String对象。 Flyweight类的相似之处在于,一旦通过构造函数创建了新对象,就不能更改它,并且它保持相同的值。但是,Flyweight类最终比使用Strings更加耗时。

https://en.wikipedia.org/wiki/Flyweight_pattern有一些很好的例子,在一个更大的CoffeeShop实现中使用Flyweight类CoffeeFlavour的几种语言的例子。这里有一个应该是一个PHP中的一个例子,我赶紧嘲笑起来:

<?php 
class CoffeeFlavour { 
    private $name; 

    function __construct(String newFlavor) { 
    $this->name = newFlavor; 
    } 

    public __toString() { 
    return $this->name; 
    } 
} 

所以CoffeeFlavour的每个实例自己的CoffeeFlavour订单使用等


另外类型不包含状态。

详细说明上述内容:与字符串类似,Flyweight类不能更改实例。这是它一旦建成就是什么。所以在上面的例子中,字符串“myString”就是这样。字符串中的任何更改都会导致创建新对象。

要使用CoffeeFlavour示例,改变咖啡的味道是相当荒谬的!这就是为什么你没有看到setName()方法。换句话说,看到以下内容:

$caffeineCoffee = new CoffeeFlavour("Caffeinated"); 
$decafCoffee = new CoffeeFlavour("Decaf"); 

有没有办法你想说的是,含咖啡因的一个“国家”突然改为无咖啡因。你会改为创建一个新的不同的饮料。这增加了它们的不变性。

当我点我的饮料,我说:$myDrink = $caffeineCoffee;,因此引用羽量级的对象。这些对象没有状态,它们只是,它们是什么。

另一方面,MySQL有一个列(类型),其中有一个状态,基于值的列表。所以这直接与学说2的方法论冲突。以下进一步阐述。


两个假设使其相当复杂与MySQL

的枚举 工种根据MySQL的文档https://dev.mysql.com/doc/refman/5.0/en/enum.html页:

一个ENUM是一个字符串对象与从列创建时在列规范中明确列举的允许值列表中选择的值。

在这种情况下,MySQL列(类型)包含一个状态(它所保存的允许值中的哪一个)。这些是在创建表时确定的,并且允许的值的任何更改都需要删除和重建表。但是,Flyweight类(如上所述)很容易根据需要添加新实例。 Flyweight类的每个类型(实例)都是唯一的,并且是不可变的。

因此,在总结:

  • 飞锤类(比如CoffeeFlavour)不会被覆盖,他们有需要增加额外的实例。
  • 这些实例永远不会改变状态。他们永远是他们创建时的样子。
  • Flyweight类的实例是几个不带状态的唯一对象,而不是具有多个可能状态的一个MySQL列。

希望这回答你的问题!

+0

它有帮助,但我想我需要做我的作业:-) – mario

+0

好吧,很高兴它帮助!如果我可以进一步澄清或简化,请告诉我。否则,upvote/answer标记会很棒! :) – Reisclef

+0

“**另外**类型不包含状态”?也许如果你从关于Flyw的第一部分分开解释它,它会更有帮助。 – mario