原型模式 vs 享元模式设计模式

16

我需要找出原型模式和享元模式之间的一些区别。我知道最基本的区别在于前者进行深度复制,而后者使用共享对象。我的讲师说还有更多的不同之处。

有人知道其他的区别吗?


4
"轻量级模式"是一种在实例之间共享底层数据以节省空间和时间的设计模式。而"原型模式"则是一种创造性抽象化的模式。因此它们指的是不同的事情,并被用于不同的场景。 - Nikos M.
GOF设计模式书籍参考http://www.uml.org.cn/c++/pdf/DesignPatterns.pdf,原型模式在第133页,享元模式在第218页。 - Nikos M.
1
我知道它们两个。但是除了我说的之外,我无法理解它们之间的区别。 - Matan
JS的原型继承与享元模式非常相似,但原型模式则完全是另一回事。 - EnderShadow8
3个回答

17
首先,它们属于不同的类别:Prototype是创建型的,Flyweight是结构型的。
在Prototype中,对象的创建是通过克隆来实现的,这样可以轻松地创建对象。通过请求克隆,我们每次都会创建新的克隆对象。
而在Flyweight中,我们尽可能地重用对象,通过请求来共享它们。如果找不到所需的对象,则会创建一个新对象。这是为了资源优化而做的。
虽然在Prototype中我们甚至可以克隆一个对象,但Flyweight模式在应用程序中使用大量对象时才有意义。
所有描述的都会影响实现方面。

5

在享元模式中,对象是不可变的。
在原型模式中,对象是可变的。

享元模式旨在通过尽可能重用现有对象而不创建新对象来节省内存。
原型模式旨在通过重用现有对象以节省新对象创建的成本。

当创建多种类型的单个对象时使用享元模式。
当创建单个类型的单个对象时使用原型模式。


1
GoF的书从未将享元定义为不可变的。他们可以是可变的。 - Géry Ogam

0

享元对象是不可变的。一旦创建,其状态就无法更改。 由于这个原因,享元对象可以被多个客户端使用而没有任何问题,而在对象池中,一个对象一次只能被一个客户端使用。

原型将通过克隆创建重复的对象,但它的状态不需要是不可变的。它只是根据给定模板按需创建另一个对象。也就是说,我们在这里创建了一个对象,因此它属于创建型模式。

在享元模式中,您不会创建新对象,而是共享不可变对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接