如何使用根据唯一键生成的属性创建对象

时间:2011-04-08 00:25:57

标签: java design-patterns

我希望对象具有一系列属性和一个唯一标识键。由于密钥是唯一的,因此可用于挑选一组特定的属性。我希望能够在实例化对象时使用该键,以便与该键关联的属性成为该对象的属性。

属性规范将是常规的(即,如果一个键具有名为description的属性,那么每个其他键都是如此)。

一个错误的例子

这个例子是我试图最初解决问题并且不足的原因。我在这里发布它来说明这种方法的问题。

我可以拥有一个具有名称和描述属性的Food类。在这种情况下,该名称应该是一个唯一的密钥,在这种情况下,只是一个描述。

public class Food {
  private String name;
  private String description;

  public Food(String name, String description) {
    this.name = name;
    this.description = description;
  }
}

此方法的问题

首先,每当我创造一种特殊的食物,比如说披萨,我每次都要输入相同的描述,说“一个受欢迎的意大利菜”。我更喜欢的是能够创建一个只知道食物名称的对象,然后为我填写其余的属性。换句话说,我应该能够传递披萨,并且将使用适当的描述创建对象。

其次,此示例没有为name属性保证唯一性。我可以创建一个披萨,其中描述了“一种受欢迎的意大利菜”,另一种则描述了“俗气的善良!”但是,我希望该名称能够唯一地挑选出一组属性。当然属性可以属于多个键(比萨饼和意大利面都可以有“意大利菜”的描述)但是键只能有特定的描述。

潜在解决方案

我想这至少需要两件事:

  1. 将名称与一组属性相关联的某种方式。 HashMap似乎是理想的选择,但在哪里存储它的好位置?将它放在Food类中似乎很奇怪。

  2. 一些创建类来处理Food对象的构建(也许这对于上面的HashMap来说是一个很好的位置?)我已经查看了Factory和Builder模式,但Factory似乎是用于创建不同的子类,我希望能够存储1000个不同的项目名称(而不是创建1000个不同的子类)。 Builder似乎用于以更简单的方式指定对象的所有属性,以便在构造函数中记住参数的顺序,同时还保证对象不能被中途实例化,但这似乎几乎与我的相反。我正在寻找。

4 个答案:

答案 0 :(得分:1)

Map是存储预定义属性的良好数据结构。但是你需要一个将属性复制到对象的代码,即调用如下代码:

food.setDescription(attrs.get("description"))

此代码可以在工厂编写。 Factory不一定会创建不同类的实例。它可以创建同一个类的实例并启动它们。

其他方法是使用模式命名模板对象。这意味着您可以使用已预定义的属性创建多个对象,如披萨,意大利面,赌注,汤等。然后,当您需要创建另一个披萨时,您首先要创建一个已经存在的披萨的副本,然后修改它以制作您的特定披萨。 java中有多种方法可以创建现有对象的副本:复制构造函数,克隆,序列化等。

答案 1 :(得分:0)

我同意hashmap是理想的,我建议使用某种mapper实用程序类,它将从xml文件或数据库中获取您的名称和描述,然后将它们插入到哈希映射中。这将是您的hashmap所在的位置。然后,您可以使用工厂构建食物对象,并从hashmap中注入名称和描述依赖项。

答案 2 :(得分:0)

您需要一个Factory和一些重载的构造函数。

public class Food {

  private static final String DEFAULT_DESCRIPTION = "My favorite!";
  private String name;
  private String description;

  public Food(String name) { 
     this(name, DEFAULT_DESCRIPTION);
  }

  public Food(String name, String description) {
    this.name = name;
    this.description = description;
  }
}

class Pizza extends Food {

  private static final String DEFAULT_DESCRIPTION = "A popular Italian dish";

  public Pizza(String name)
  {
     super(name, Pizza.DEFAULT_DESCRIPTION);
  }

  public Pizza(String name, String description) {
     super(name, description);
  }

}

public class FoodFactory {

    private static final FoodFactory instance = new FoodFactory();

    private FoodFactory() {}

    public static FoodFactory getInstance() { retun this.instance; }

    public Food create(String name, String description) {
        // Here's where you can create different kinds of food based on your requirements
    }
}

答案 3 :(得分:0)

您可以使用ORM框架(如Hibernate)将Java类映射到数据库表,这将负责管理和生成Java类的主键。