返回

剥开工厂模式神秘的面纱:依赖抽象,迈向代码自由之路

Android

在软件工程浩瀚的世界里,设计模式如同一座闪耀的灯塔,为迷失的程序员指引前进的道路。 它们是一组经过时间考验的解决方案,帮助我们构建灵活、可维护和可扩展的代码。其中,工厂模式就像一位经验丰富的工匠,指导我们如何创建对象,而无需直接依赖具体的类。

工厂模式遵循依赖倒置原则(Dependency Inversion Principle,DIP)的精髓。 DIP 告诉我们,我们应该优先依赖于抽象类或接口,而不是具体类。原因很简单,实体类往往是易变的,依赖于它们会带来问题。而抽象接口却更稳定,能让我们免受大多数变化的影响。

工厂模式巧妙地利用了这一原则,让我们仅依赖于抽象接口就能创建出具体对象的实例。 这就好比我们去餐厅点餐,我们只需要告诉服务员想要吃什么,至于厨师如何烹饪,我们并不关心。工厂模式就是那个服务员,而具体的对象则是厨师烹饪出来的菜肴。

使用工厂模式的好处是显而易见的。 首先,它提高了代码的灵活性。当我们需要改变某个实体类的实现时,我们只需要修改工厂类即可,而无需修改所有依赖于该实体类的代码。其次,它增强了代码的可测试性。我们可以轻松地为工厂类编写单元测试,而无需依赖于具体的实体类。

工厂模式的应用场景非常广泛。 例如,我们可以使用工厂模式来创建数据库连接、日志记录器、缓存对象等。在开发框架中,工厂模式也经常被用来创建各种各样的组件。

现在,让我们用一个简单的例子来演示工厂模式的用法。 假设我们有一个名为 Shape 的抽象接口,它定义了各种形状的通用操作。我们还可以定义几个具体的形状类,如 CircleRectangleTriangle,它们都实现了 Shape 接口。

public interface Shape {
    double getArea();
}

public class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

public class Rectangle implements Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double getArea() {
        return width * height;
    }
}

public class Triangle implements Shape {
    private double sideA;
    private double sideB;
    private double sideC;

    public Triangle(double sideA, double sideB, double sideC) {
        this.sideA = sideA;
        this.sideB = sideB;
        this.sideC = sideC;
    }

    @Override
    public double getArea() {
        double s = (sideA + sideB + sideC) / 2;
        return Math.sqrt(s * (s - sideA) * (s - sideB) * (s - sideC));
    }
}

然后,我们定义一个工厂类 ShapeFactory,它负责创建各种形状的对象。

public class ShapeFactory {
    public static Shape createShape(String shapeType) {
        switch (shapeType) {
            case "Circle":
                return new Circle(1.0);
            case "Rectangle":
                return new Rectangle(2.0, 3.0);
            case "Triangle":
                return new Triangle(3.0, 4.0, 5.0);
            default:
                throw new IllegalArgumentException("Invalid shape type: " + shapeType);
        }
    }
}

最后,我们就可以使用 ShapeFactory 来创建各种形状的对象,而无需直接依赖于具体的形状类。

Shape circle = ShapeFactory.createShape("Circle");
Shape rectangle = ShapeFactory.createShape("Rectangle");
Shape triangle = ShapeFactory.createShape("Triangle");

System.out.println("Circle area: " + circle.getArea());
System.out.println("Rectangle area: " + rectangle.getArea());
System.out.println("Triangle area: " + triangle.getArea());

输出结果如下:

Circle area: 3.141592653589793
Rectangle area: 6.0
Triangle area: 6.0

通过这个例子,我们看到了工厂模式的强大之处。 它不仅提高了代码的灵活性、可测试性和可维护性,而且使我们的代码更加易于理解和扩展。

如果你想成为一名优秀的软件工程师,那么你必须掌握设计模式。 工厂模式只是其中之一,还有很多其他设计模式值得你学习。只有掌握了这些设计模式,你才能写出高质量、可维护和可扩展的代码。