工厂或简单工厂设计模式





0/5 (0投票)
现实世界中的工厂
现实世界中的工厂是一个生产物品或产品的场所。例如:汽车工厂就是生产汽车的地方。如果你想要一辆汽车,你是想自己制造还是从工厂/生产线获取一辆?
工厂或简单工厂设计模式是 GOF(Gang of Four)面向对象设计模式的一部分。它属于 创建型设计模式。
创建型设计模式指导开发人员如何在代码中创建对象,从而有助于应用程序的长期可维护性和可测试性。
现在,让我们深入了解工厂设计模式的完整细节。
目的
工厂设计模式的目的是封装对象创建到单独的类中。
这是什么意思?让我们来理解一下。
例如,如果你想在 Java 中创建一个对象,我们使用 new 运算符来创建它。当你要创建对象的类易于理解时,这样做效果很好。
在某些情况下,一个类可能有不同的构造函数,并且在创建对象时可能需要不同的构造函数参数。在这种情况下,作为开发人员,你需要在创建对象之前充分理解构造函数。
另外,如果你想在多个地方创建对象,你需要使用相同的代码或步骤来创建对象。这会导致多处代码重复,以后如果你想更改对象创建方式,你需要在所有地方进行更新。这是典型的代码重复问题。
与其自己创建对象,不如将其委托给一个单独的类,这样问题就解决了。另一个优点是,任何新开发人员都不需要了解创建逻辑,并且可以在需要时使用该类。
何时应考虑使用工厂模式?
当你想要创建实现通用接口的不同类型的对象的实例时。
例如,
你有一个 UI 应用程序,用于创建圆形、正方形、矩形、三角形等形状。为此,你可以在画布对象上实例化所有这些对象,并根据用户的选择引用正确的对象。
你需要使用 Java 中的 new 运算符每次创建对象。在这种情况下很简单,但在更复杂的应用程序中,对象创建过程可能需要复杂的初始化步骤、设置构造函数参数或处理依赖关系。
每次使用 new 运算符创建对象的地方都可能导致代码重复和代码复杂性,这最终会使应用程序更难维护。
解决方案
与其在需要时创建对象,不如将此委托给工厂类。
工厂类公开不同的方法来创建 Shape 类的实例。它将对象创建封装在一个类中。客户端(例如我们的 Canvas 类)可以仅仅向工厂请求新实例,而无需担心这些实例是如何创建的。
这突显了代码更易于管理、可测试以及更易于修改或扩展的优点。
易于管理 - 可以轻松创建新的工厂,并用较少的客户端更改来替换现有工厂。
可测试 - 工厂类和对象创建可以独立于客户端进行测试。客户端可以在单元测试期间模拟工厂。
可扩展性 - 可以轻松地将新形状添加到工厂类,而不会干扰客户端。
创建工厂模式的算法或步骤
阅读了许多设计模式后,我发现它们很容易理解,但难以实现。原因是,我们不知道要遵循的步骤。
请遵循以下步骤高效地实现工厂设计模式。下一步的示例中实现了相同的步骤。
这些步骤是基于我们的 Shape 工厂示例设计的。
步骤 1:创建通用接口或抽象类
我们有不同的形状,如圆形、矩形、正方形。第一步是创建 Shape 接口。如果所有形状都有一些通用功能,你也可以选择抽象类。
步骤 2:通过实现/扩展接口/抽象类来创建具体类
下一步是通过实现步骤 1 中创建的接口来创建具体的类,如 Circle、Rectangle 等。
步骤 3:创建工厂类并提供创建对象的的方法
这是你的实际工厂类实现所在步骤。你需要创建工厂类并提供用于实例化具体类对象的 方法。
步骤 4:创建客户端并使用工厂
在最后一步中,客户端不再自己创建对象,而是使用工厂类来实现相同的目的。
遵循这些步骤可以带来代码易于管理、可测试以及更易于修改或扩展的优点。
示例
<code class="language-java"> // Step 1: Create common interface or abstract class public interface Shape { } // Step 2: Create concreate classes by implementing/extending interace/abstract class public class Circle implementes Shape { } public class Square implements Shape { } // Step 3: Create the factory class and provide methods to create the object public class ShapeFactory { private static final String CIRCLE = "circle"; private static final String SQUARE = "square"; public Shape createShape(String shape) { if(CIRCLE.equals(shape)) { return new Circle(); } if(SQUARE.equals(shape)) { return new Square(); } return null; } } // Step 4: Create the clients and use the factory public class Canvas { private ShapeFactory factory; public Canvas(ShapeFactory factory) { this.factory = factory; } public void drawShape(String shapeType) { Shape shape = factory.createShape(shapeType); // draw the shape, etc. } } </code>
优点
- 将对象创建委托给另一个类,从而消除了代码重复。
- 易于维护或扩展。
- 松耦合。
- 由于所有对象创建都在一个地方,因此工厂模式可以更轻松地用存根或模拟对象替换这些实例以进行测试。
- 添加新类型的对象而不干扰现有代码更加容易。
- 工厂也可以实现为单例,以跟踪对象实例。
缺点
- 当应用程序有大量类需要管理时,工厂类的代码复杂度会增加,因为所有对象创建都通过一个工厂类路由。
- 想象一下有数百种形状,并且使用一个 Shape Factory 类创建所有形状对象会使形状创建逻辑过于复杂。