在Java中,假设我有一个名为"PERSON"的对象,它扩展了"MESH"。假设在 MESH 类(或其他类)中,我有一个创建 MESH 实例的静态方法。例如:
Mesh m = Mesh.createMesh(parameters)
现在假设我有班级人...如何使用工厂来创建人的"网格"部分?
Person p = Mesh.createMesh(parameters)
我不确定引用 p 不能指向没有 Person 属性的对象,但我想以某种方式让人的"网格"部分重用"工厂"方法中的代码。
我希望我说清楚了...
在Person
类中,你可以有一个静态工厂方法createPerson(parameters)
该方法调用createMesh(parameters)
,然后根据从createMesh(parameters)
返回的Mesh
创建一个Person
对象。例如:
public class Person extends Mesh {
public static Person createPerson(... parameters) {
Mesh mesh = createMesh(parameters);
// now create the Person instance using details from the mesh object
return new Person(mesh, parameters); // or whatever method of creating your Person object that you need to perform
}
}
最终,Mesh.createMesh()
必须委托给Mesh
的构造函数(或子类的构造函数,子类委托给构造函数进行Mesh
。您可以使该构造函数受到保护,并在Person
构造函数中使用该受保护的构造函数:
public class Person extends Mesh {
private Person(Parameters parameters) {
super(parameters);
// do more here
}
public static Person create(Parameters parameters) {
return new Person(parameters);
}
}
为了使这种事情干净地工作,你需要使用组合而不是继承。也就是说,一个人应该有一个网格,而不是一个网格。
public static Person() {
public final Mesh mesh;
public Person(Mesh mesh) {
this.mesh = mesh;
}
}
然后你可以写Person p = new Person(Mesh.createMesh(...));
.
如果你真的希望一个人成为网格体。然后你需要这样的东西:
public static class Mesh {
protected Mesh(MeshParameters params) {
...
}
public static Mesh createMesh(MeshParameters params) {
return new Mesh(params);
}
}
public static Person extends Mesh {
protected Person(MeshParameters params) {
super(params);
...
}
public static Person createPerson(MeshParameters) {
return new Person(params);
}
}
然后你可以使用 Person p = Person.createPerson(...)
.