概述
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。同时它可以达到一定程度上的解耦和。
举例说明
假如我们有一个接口Shape,它有三个实现类Circle、Rectangle、Squire。
public interface Shape {
void talk();
}
public class Circle implements Shape {
@Override
public void talk() {
System.out.println("Circle is talking");
}
}
public class Rectangle implements Shape {
@Override
public void talk() {
System.out.println("Rectangle is talking");
}
}
public class Square implements Shape {
@Override
public void talk() {
System.out.println("Square is talking");
}
}
在正常情况下我们要是创建圆形一般使用:Shape shape = new Circle()
,创建其他的也类似。这样的话就会有一个很大的问题,就是如果这时我不再需要创建圆形,而是创建矩形,那么就得修改源代码为:Shape shape = new Rectangle()
。这种情况就被称作耦合,也可以理解成两段代码之间发生了依赖关系。
借助工厂模式会怎么做呢?它会创建一个工厂类,用传参的方式来使Shape和它的实现类解耦和。
public class Factory {
public Shape getShape(String shape) {
if("Circle".equals(shape))
return new Circle();
else if("Rectangle".equals(shape))
return new Rectangle();
else if("Square".equals(shape))
return new Square();
return null;
}
}
在这种情况下,我们要是想创建一个形状,只需要传入参数就行。
public class Test {
public static void main(String[] args) {
Factory factory = new Factory();
Shape shape1 = factory.getShape("Circle");
Shape shape2 = factory.getShape("Rectangle");
Shape shape3 = factory.getShape("Square");
shape1.talk();
shape2.talk();
shape3.talk();
}
/* Console:
Circle is talking
Rectangle is talking
Square is talking */
}
但是这样只是达到了部分解耦和,因为Shape和它的实现类没有耦合了,但是Shape和Factory存在耦合。想要完全解耦和还需要用到反射和配置文件。