为什么 (GoF) Flyweight 是一种结构性(而非创造性)设计模式?
Why is the (GoF) Flyweight a structural (and not a creational) design pattern?
据我了解,flyweight 设计模式与工厂或单例设计模式没有太大区别。
它只是一个生产不可变(和池化)对象的工厂。
它只是一个单例,为每种类型(托管对象的)提供一个实例,而不是全局单个实例。
工厂和单例是创建型模式,那么为什么flyweight应该被认为是结构型模式?
享元模式不创建任何对象。它用于存储在多个对象之间共享的数据。您可以将它的使用与 class 中的静态 methods/variables 进行比较。您可以使用保存此方法或数据的全局实例来减少应用程序的内存占用,而不是为每个实例定义它们。
假设您正在使用多个解析器解析一个大型数据文件,而不是让每个解析器读取完整的数据文件,您可以使用享元模式来保存每个解析器都可以访问的数据文件的单个实例。
享元模式的本质不是对象的创建而是对象的共享。该模式声明要共享的对象通常保存在一些外部数据结构中,但没有指定如何创建或表示这些数据结构。
使模式结构化的是使用类似工厂的 class 来获取享元。这在设计上强加了静态结构。
据我了解,flyweight 设计模式与工厂或单例设计模式没有太大区别。
它只是一个生产不可变(和池化)对象的工厂。 它只是一个单例,为每种类型(托管对象的)提供一个实例,而不是全局单个实例。
工厂和单例是创建型模式,那么为什么flyweight应该被认为是结构型模式?
享元模式不创建任何对象。它用于存储在多个对象之间共享的数据。您可以将它的使用与 class 中的静态 methods/variables 进行比较。您可以使用保存此方法或数据的全局实例来减少应用程序的内存占用,而不是为每个实例定义它们。
假设您正在使用多个解析器解析一个大型数据文件,而不是让每个解析器读取完整的数据文件,您可以使用享元模式来保存每个解析器都可以访问的数据文件的单个实例。
享元模式的本质不是对象的创建而是对象的共享。该模式声明要共享的对象通常保存在一些外部数据结构中,但没有指定如何创建或表示这些数据结构。
使模式结构化的是使用类似工厂的 class 来获取享元。这在设计上强加了静态结构。