Flyweight与Singleton模式之间的实际使用差异是什么?

时间:2013-05-25 14:55:41

标签: design-patterns

这两种模式似乎达到了同样的效果。在现实世界中有哪些不同的用例? 感谢

7 个答案:

答案 0 :(得分:20)

Flyweight就是当你有许多不同种类的时候。

Singleton就是你有一件事。

例如,您可以使用Flyweight模式来表示键盘字符。 a的一个对象,b的一个对象,等等。它们都是字符,但不同的字符。

相反,您可以使用单例来表示键盘。只能有一个。

答案 1 :(得分:15)

单身人士通常是可变的。对于轻量级而言,这是不可能的。例如。 flyweight可能代表一种颜色。如果您创建了一个红色并且它是绿色的话会让人感到困惑,因为它的底层flyweight对象在代码中的其他地方被更改为绿色。

另外我会说单身是一种轻量级的子模式。您可以将单个颜色对象视为单例,但它们都是您使用工厂选择正确的单件/飞行对象的系统的一部分。

关于先例,真的很多。 Flyweights不会呈现给API的用户,就像它们是唯一的对象一样,而单身人士则是。

Cocoa(Objective-C)的例子:

UIApplication.sharedApplication.statusBarHidden = YES

这显然是一个单一对象,您可以更改其状态。

UIColor *red = [UIColor redColor]

用户不需要知道红色是否是单身,因为它是不可变的。创建后无法更改颜色对象。因此,对于用户来说,无论是单身还是创建新对象都没有实际意义。因此,将它称为flyweight更有意义。这完全是出于意图。

答案 2 :(得分:6)

他们是无关的:

Flyweight尽可能重用(显然是不可变的)类的实例,而不是创建具有相同“值”的类的新实例,这样可以节省CPU和内存。

Singleton是指只有一个(通常是可变的)类的实例。它通常用在多线程环境中,以便使用单个实例并“看到”相同的状态来促进所有线程。

答案 3 :(得分:2)

当存在明确的对象内在和外在状态的隔离时,使用Flyweight。内在状态可以与其他外在对象共享。例如,文档的标题可以被分类为对象的固有状态并且可以在其间共享。但是文档中的其余数据可能非常动态并且由用户填充(外部数据)。为了表示内在数据,可以在flyweight工厂内创建和维护flyweight对象。 Flyweight工厂对象将作为flyweight(标题对象)的集合,并且可以在之前填充,并在我们的案例中跨文档的各种实例共享。

答案 4 :(得分:1)

不要忘记单身是一种创作模式,而轻量级是一种结构模式。因此,这两种模式的目标是完全不同的

答案 5 :(得分:1)

flyweight structural 模式从根本上消除了实现特定目标所需的对象重复项。例如,假设您正在键入一篇文章(或堆栈溢出后的帖子),该文章最终由(英文)字母表中的相同26个字母组成,重复了多次。拥有1000个单独的对象,每个对象代表字母“ E”,或者拥有一个单独的对象,代表字母“ E”,被引用1000次,会更有效吗? (提示,通常是后者)

如何实现每个对象(即26个字母)的创建是一个单独的问题,但是通常可以通过工厂方法来实现( creative 模式),利用了“类似单身”的特征。

  • 初始化一个空字符集。
  • 是否需要字母'E'?
  • 如果已经存在,请从集合中检索该对象,否则创建一个新字母'E'并将其存储在集合中,以备下次使用。

这是通过成熟的单例对象完成的,还是仅由工厂方法可以访问的私有变量完成的?可能会或可能不会。但是,无论哪种方式,单例模式都是 creative 模式,它描述了在任何给定时间点仅存在一个对象的单个实例的方式,并且与诸如“删除实现特定目标所需的对象重复项。”

答案 6 :(得分:0)

它们是两个完全不同的“模式类型”。单身人士是一种“创造”模式。创建模式是更高阶的常见“对象创建”方法。另一方面,Flyweight是一种“结构模式”。结构模式必须在接口和实现方面做得更多,而不是“对象创建”。描述差异的另一种更简单的方法是第一种模式类型“创建模式”更基于名词。第二种“结构模式”类型更基于动词。