没有抽象 类 和接口的工厂方法
Factory method without abstract classes and interfaces
我是新手,正在尝试弄明白。我阅读了一些关于工厂方法的教程并这样做了:我有一个父 class A 和几个带有 getter 和 setter 的字段。还有另外两个 classes B 和 C(未来计划更多)继承自 A,并且有几个带有 getter 和 setter 的字段。
这种模式的所有教程通常都有一个抽象 class 或 class 由 B 和 C 实现的接口。但我使用的是通常的 class A,在某些情况下应该用作 classes B 和 C。在我的程序中有一些自动 classification,使用它我可以理解在 class 我需要的运行时。
这是工厂方法模式的实现吗?而且这段代码没有问题?
public class A {
private String x1 = "some value";
private String x2;
public String x1() {
return x1;
}
public void setX1(String x1) {
this.x1 = x1;
}
public String getX2() {
return x2;
}
public void setX2(String x2) {
this.x2 = x2;
}
}
public class B extends A {
private String x3;
private String x4;
public String getX3() {
return x3;
}
public void setX3(String x3) {
this.x3 = x3;
}
public String getX4() {
return x4;
}
public void setX4(String x4) {
this.x4 = x4;
}
}
public class C extends A {
private String x5;
private String x6;
public String getX5() {
return x5;
}
public void setX5(String x5) {
this.x5 = x5;
}
public String getX6() {
return x6;
}
public void setX6(String x6) {
this.x6 = x6;
}
}
public class MyClassFactory {
public static A getMyClass(String criteria)
{
switch (criteria){
case "class B":
return new B();
case "class C":
return new C();
default:
return new A();
}
}
}
是的,这是一个工厂模式实现,因为您将对象创建的逻辑从客户端抽象出来,并将此责任委托给另一个方法,该方法根据一些通用标准选择要创建的类型。
您的代码的一个缺点是子类 B 和 C 添加了一些 public getter 和 setter,它们在创建后不会立即可见,因为返回的对象类型是 A(如果通过基础对象确实可能是 B 或 C)。您会将创建的对象转换为 B 或 C。
示例:
MyClassFactory.getMyClass("class B").getX3() // you can't call getX3() since this method belongs to B, but the object returned by the factory is typed as A
乍一看,您的代码似乎是工厂模式实现 (wiki link)。来自维基百科:
A (software) design pattern is a general solution to a common problem
in software design. It is a description or template for how to solve a
problem, that can be used in different situations. A design pattern
typically shows relationship and interaction between classes or
objects, without specifying final application classes or objects that
are involved. Patterns identify and specify abstractions that are
above the level of single classes and instances.
话虽如此,恕我直言,模式的实施没有正确或错误之分。该模式用于指导、保证和保护工程师将做出的结构选择。然而,有时开发人员会被带走并尝试将他们所做的一切都适应一个模式,即使该模式不是解决他们问题的最佳方案,而且通常代码会变得混乱。
我是新手,正在尝试弄明白。我阅读了一些关于工厂方法的教程并这样做了:我有一个父 class A 和几个带有 getter 和 setter 的字段。还有另外两个 classes B 和 C(未来计划更多)继承自 A,并且有几个带有 getter 和 setter 的字段。 这种模式的所有教程通常都有一个抽象 class 或 class 由 B 和 C 实现的接口。但我使用的是通常的 class A,在某些情况下应该用作 classes B 和 C。在我的程序中有一些自动 classification,使用它我可以理解在 class 我需要的运行时。 这是工厂方法模式的实现吗?而且这段代码没有问题?
public class A {
private String x1 = "some value";
private String x2;
public String x1() {
return x1;
}
public void setX1(String x1) {
this.x1 = x1;
}
public String getX2() {
return x2;
}
public void setX2(String x2) {
this.x2 = x2;
}
}
public class B extends A {
private String x3;
private String x4;
public String getX3() {
return x3;
}
public void setX3(String x3) {
this.x3 = x3;
}
public String getX4() {
return x4;
}
public void setX4(String x4) {
this.x4 = x4;
}
}
public class C extends A {
private String x5;
private String x6;
public String getX5() {
return x5;
}
public void setX5(String x5) {
this.x5 = x5;
}
public String getX6() {
return x6;
}
public void setX6(String x6) {
this.x6 = x6;
}
}
public class MyClassFactory {
public static A getMyClass(String criteria)
{
switch (criteria){
case "class B":
return new B();
case "class C":
return new C();
default:
return new A();
}
}
}
是的,这是一个工厂模式实现,因为您将对象创建的逻辑从客户端抽象出来,并将此责任委托给另一个方法,该方法根据一些通用标准选择要创建的类型。
您的代码的一个缺点是子类 B 和 C 添加了一些 public getter 和 setter,它们在创建后不会立即可见,因为返回的对象类型是 A(如果通过基础对象确实可能是 B 或 C)。您会将创建的对象转换为 B 或 C。
示例:
MyClassFactory.getMyClass("class B").getX3() // you can't call getX3() since this method belongs to B, but the object returned by the factory is typed as A
乍一看,您的代码似乎是工厂模式实现 (wiki link)。来自维基百科:
A (software) design pattern is a general solution to a common problem in software design. It is a description or template for how to solve a problem, that can be used in different situations. A design pattern typically shows relationship and interaction between classes or objects, without specifying final application classes or objects that are involved. Patterns identify and specify abstractions that are above the level of single classes and instances.
话虽如此,恕我直言,模式的实施没有正确或错误之分。该模式用于指导、保证和保护工程师将做出的结构选择。然而,有时开发人员会被带走并尝试将他们所做的一切都适应一个模式,即使该模式不是解决他们问题的最佳方案,而且通常代码会变得混乱。