public interface Shape {
void draw();
}
class Square implements Shape {
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
class ShapeFactory {
//use getShape method to get object of type shape
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//get an object of Square and call its draw method.
Shape shape1 = shapeFactory.getShape("Square");
//call draw method of square
shape1.draw();
}
}
我在学习设计模式时获得了此代码,在此代码中,getShape
方法的返回类型为Shape
(接口)。
那么接口类型是否可以设置为另一种方法的返回类型?
答案 0 :(得分:2)
那么,接口类型是否可以设置为另一种方法的返回类型?
是的,在Java中,可以始终将任何方法的返回值声明为接口类型。引用specification(强调我的):
接口声明引入了一个新的引用类型,其成员是类,接口,常量和方法。此类型没有实例变量,通常声明一个或多个抽象方法; 其他不相关的类可以通过提供其抽象方法的实现来实现接口。接口可能无法直接实例化。
在Java中,有两种类型的种:
byte, short, int, long, float, double, and boolean
)因此,当您有一个接口Shape
时,您可以声明其返回类型( Reference 类型)为Shape
的方法。由于Shape
是一个接口,因此您无法直接实例化它,因为它是abstract
(如果执行Shape abstractShape = new Shape();
,您将收到编译器错误:Shape is abstract; cannot be instantiated
)。在这方面,返回类型声明类似于变量类型声明。
这里没有特定的工厂设计模式,尽管它在实施工厂时特别重要。通常,只要您认为编码到接口是特定功能的良好实践,将返回类型声明为接口就可以实现这种做法。
答案 1 :(得分:2)
这实际上是一个很好的做法,因为您正在为接口而不是Classes进行编程,这隐藏了实现的细节并使您的代码更容易维护。想象一下:你有一个接口X,两个实现它的类(A和B)和另一个有一个叫做foo()的方法的类(C)。由于类A和B都实现了X,因此foo()的返回可以是X,它允许您返回A或B对象。 在Java中,当你有一个实现接口的类时,该类的实例也是该接口的一个实例,这就是你可以使用接口作为返回类型的原因。
为了测试我所说的内容,您可以创建一个名为MyInterface的接口和一个实现MyInterface的Class TestClass。如果你创建一个TestClass实例(比如说“myClass”),如果编译并运行这段代码,你可以检查一下:
if (myClass instanceof MyInterface) {
System.out.println("Hey, I'm an instance of MyInterface!");
}
答案 2 :(得分:1)
这是工厂方法模式的基础: 工厂方法通常返回接口类型, 并且将返回的特定类是隐藏的实现细节。
典型的例子是java.util.Collections
中的各种工厂方法,例如emptyList
,singletonList
,等等。
这些方法返回List
类型,实现完全隐藏。
另一个很好的例子是java.util.EnumSet
中的工厂方法,
返回类型EnumSet
,这是一个abstract
类。
根据底层枚举类型的大小,如果底层枚举类型包含64个或更少的元素(如大多数枚举类型那样),则方法将返回RegularEnumSet
实例,或者JumboEnumSet
实例。
这是EnumSet
的两种不同实现。确切的类型与客户无关,可以隐藏实现细节。
答案 3 :(得分:0)
这是一种抽象方式,“隐藏实际实施”。