实例化扩展类或其父类(取决于具体情况)

时间:2016-02-25 12:25:13

标签: java oop design-patterns

假设我在Human中有一个名为ProjectA的班级。它在同一项目的CreatureBuilder类中实例化。

现在我想在另一个项目中创建一个名为Cyborg的新类,即ProjectBProjectB在其导入中有ProjectA,但ProjectAProjectB一无所知。

Cyborg extends Human,并且还必须由CreatureBuilder的{​​{1}}实例化(因此,ProjectA位于Cyborg,我致电ProjectBCreatureBuilder到实例化ProjectB,但Cyborg位于CreatureBuilder,以及我的ProjectA类。

我需要一个逻辑来在HumanHuman实例化时创建CreatureBuilder,并在ProjectA从{Cyborg实例化时创建CreatureBuilder 1}}。

我认为通过在ProjectB中使用getCreature()方法创建界面是可以实现的。此方法将在ProjectAProjectB中重写,然后传回return new Cyborg的{​​{1}}。 还有其他建议吗?您认为最好的解决方法是什么?我可以改用反射API吗?

干杯!

2 个答案:

答案 0 :(得分:4)

Java 8

CreatureBuilder可以通过要求Supplier将创作者的创作委托给来电者。

public class CreatureBuilder {
    public Creature getCreature(Supplier<Creature> creatureSupplier)
    {
        //do some unknown things
        return creatureSupplier.get();
    }
}

ProjectA的用法

public class ProjectA {
    public static void main(String[] args) {
        Creature A = new CreatureBuilder().getCreature(Human::new);
    }
}

ProjectB的用法

public class ProjectB {
    public static void main(String[] args) {
        Creature B = new CreatureBuilder().getCreature(Cyborg::new);
    }
}

如果你没有被迫,就不要使用反思。

Java 7

如果您坚持使用Java 7,原则仍然相同,只是它更冗长。

您必须声明并使用您自己的类似供应商的界面

public interface CreatureSupplier {
    Creature get();
}

public class CreatureBuilder {
    public Creature getCreature(CreatureSupplier creatureSupplier)
    {
        //do some things
        return creatureSupplier.get();
    }
}

用法稍微冗长

public class ProjectA {
    public static void main(String[] args) {
        Creature A = new CreatureBuilder().getCreature(new CreatureSupplier() {
            @Override
            public Creature get() {
                return new Human();
            }
        });
    }
}

public class ProjectB {
    public static void main(String[] args) {
        Creature B = new CreatureBuilder().getCreature(new CreatureSupplier() {
            @Override
            public Creature get() {
                return new Cyborg();
            }
        });
    }
}

而且......那就是它,你得到了与Java 8中相同的行为。

答案 1 :(得分:0)

我认为你正在看工厂模式。是的,您可以使用项目A中的接口和工厂类以及扩展它的B中的工厂类来完成它。

示例:

在项目A中:

public interface CreatureBuilder
{
   Creature getCreature(String type);
}

public class Creature
{
   //fields of Creature class
}

public class Human extends Creature
{
  //fields of Human
}

public class Ape extends Creature
{
  //fields of Ape
}



public class ProjectAFactory implements CreatureBuilder
{
   @Override
   public Creature getCreature( String type )
   {
      switch(type)
      {
         case("Human"): return new Human();
         case("Ape") : return new Ape();
         default : return null;
      }
   }
}

您可以致电ProjectAFactory.getCreature("Human");创建人物对象

然后在项目B中

public class ProjectBFactory extends ProjectAFactory
{
    @Override
    public Creature getCreature(String type)
    {
       switch(type)
       {
          case ( "Cyborg" ) : return new Cyborg();
          default : return super.getCreature(type);
       }
    }

}


public class Cyborg extends Creature
{
   //fields related to Cyborg which also fields of Creature in project A
}

您可以致电ProjectBFactory.getCreature("Cyborg");创建Cyborg甚至ProjectBFactory.getCreature("Human")以获取人物对象。