我没有看到任何使用flyweight模式。它真的有用吗?

时间:2016-10-02 14:25:25

标签: java object design-patterns flyweight-pattern

要应用flyweight模式,我们需要将Object属性划分为内部属性和外部属性。内在属性使对象唯一,而外在属性由客户端代码设置并用于执行不同的操作。

但我的问题是为什么我们不能将内在属性和外在属性都作为实例变量(参见下面的Email类),只需在循环外创建一个对象并在循环中设置参数并发送多个具有不同参数的电子邮件。

public class Test {
    public static void main(String[] args) {
        Email ob = new Email();
        for (int i = 0; i < 10; i++) {
            ob.sender = String.valueOf(i);
            ob.sendEmail();
        }
    }
}

public class Email {
    public String sender;
    public void sendEmail()
    {
        System.out.println("Email sent to sender:"+sender);
    }
}

2 个答案:

答案 0 :(得分:4)

有时候,模式并不明显,但并不意味着它们毫无用处。而且我害怕你错误地理解了飞重模式。

主要思想是通过共享之前已经使用过的相同对象来最小化内存使用。通常,内部有一个数据结构,负责保存值并按某些标准返回它们。它查找已存在的元素而不是创建新元素。

实际上,这很有用。例如,JDK使用此模式提供Integer缓存(保留一小部分值以有效地返回它们)和String池(查看intern()方法)。 / p>

答案 1 :(得分:0)

Flyweight告诉的是'应该如何处理不可变对象的方式'

  • 如果某些类型的对象是不可变的(我通常希望所有对象尽可能不变),
  • 您在应用程序内部创建了一种对象,其中包含一些属性集,例如:使用Person 不可变 name = "John", age = 20对象>
  • 在应用程序执行(name = "John", age = 20)之后,您有另一个完全相同的对象,
  • 只需使用之前创建的一个,不需要创建另一个(不需要担心,因为它是immutable,属性不会在那之后改变)

所以它基本上是一种节省内存的工作。它与面向对象无关。