原文: https://howtodoinjava.com/design-patterns/creational/implementing-factory-design-pattern-in-java/

在 Java 中创建类实例的最常用方法是什么? 大多数人会回答这个问题:“使用new新关键字”。 好吧,它现在被认为是老式的。 让我们看看如何?

如果对象创建代码散布在整个应用中,并且如果您需要更改对象创建过程,则需要在每个地方进行必要的更改。 在完成本文之后,在编写应用时,请考虑使用 Java 工厂模式

在我以前的文章“ Java 中的 单例设计模式”中,我们讨论了创建类实例的各种方法,以使同一 JVM 中不存在同一类的另一个实例。

在这篇文章中,我将演示另一个创建型模式,即工厂模式,用于为您的类创建实例。 顾名思义,工厂是一个创建一些不同产品的地方,这些产品在功能上有些相似,但又分为几类。

在 Java 中,工厂模式用于创建相同类型的不同类的实例。

  1. Table of Contents
  2. 1\. When to implement factory pattern?
  3. 2\. Factory Pattern Implementation
  4. 3\. Advantages of factory pattern
  5. 4\. Final notes

1.什么时候使用工厂模式?

工厂模式引入了类之间的松散耦合,这是在设计应用架构时应考虑并应用的最重要的原则。 通过针对抽象实体(而不是具体的实现)进行编程,可以在应用架构中引入松耦合。 这不仅使我们的架构更加灵活,而且不那么脆弱。

一张图片胜过千言万语。 让我们看看工厂实现的样子。

Java 工厂模式说明 - 图1

上图以汽车工厂为例描述了一种常见情况,该工厂能够制造 3 种类型的汽车,即小型,轿车和豪华型汽车。 制造汽车需要从分配配件到最终化妆的许多步骤。 这些步骤可以作为方法编写在程序中,并在创建特定汽车类型的实例时调用。

如果很不幸,那么我们将在我们的应用类中创建汽车类型的实例(例如SmallCar),因此我们会将汽车制造逻辑暴露给外界,这当然不好。 这也阻止了我们对汽车制造过程的更改,因为代码不是集中的,并且在所有组成类中进行更改似乎都不可行。

2. Java 工厂模式示例

到目前为止,我们已经设计了用于制造CarFactory的类。 现在创建它们。

2.1 对象类型

CarType将保留汽车类型,并将为所有其他类别提供汽车类型。

  1. package designPatterns.creational.factory;
  2. public enum CarType {
  3. SMALL, SEDAN, LUXURY
  4. }

2.2 对象实现

Car是所有汽车实例的父类,并且还将包含适用于所有类型汽车的通用逻辑。

  1. package designPatterns.creational.factory;
  2. public abstract class Car {
  3. public Car(CarType model) {
  4. this.model = model;
  5. arrangeParts();
  6. }
  7. private void arrangeParts() {
  8. // Do one time processing here
  9. }
  10. // Do subclass level processing in this method
  11. protected abstract void construct();
  12. private CarType model = null;
  13. public CarType getModel() {
  14. return model;
  15. }
  16. public void setModel(CarType model) {
  17. this.model = model;
  18. }
  19. }

LuxuryCarLUXURY型汽车的具体实现。

  1. package designPatterns.creational.factory;
  2. public class LuxuryCar extends Car {
  3. LuxuryCar() {
  4. super(CarType.LUXURY);
  5. construct();
  6. }
  7. @Override
  8. protected void construct() {
  9. System.out.println("Building luxury car");
  10. // add accessories
  11. }
  12. }

SmallCarSMALL型汽车的具体实现。

  1. package designPatterns.creational.factory;
  2. public class SmallCar extends Car {
  3. SmallCar() {
  4. super(CarType.SMALL);
  5. construct();
  6. }
  7. @Override
  8. protected void construct() {
  9. System.out.println("Building small car");
  10. // add accessories
  11. }
  12. }

SedanCarSEDAN型汽车的具体实现。

  1. package designPatterns.creational.factory;
  2. public class SedanCar extends Car {
  3. SedanCar() {
  4. super(CarType.SEDAN);
  5. construct();
  6. }
  7. @Override
  8. protected void construct() {
  9. System.out.println("Building sedan car");
  10. // add accessories
  11. }
  12. }

2.3 创建对象的工厂

CarFactory.java是我们使用工厂模式实现的主要类。 仅在确定实例类型之后,才会实例化实例。

  1. package designPatterns.creational.factory;
  2. public class CarFactory {
  3. public static Car buildCar(CarType model) {
  4. Car car = null;
  5. switch (model) {
  6. case SMALL:
  7. car = new SmallCar();
  8. break;
  9. case SEDAN:
  10. car = new SedanCar();
  11. break;
  12. case LUXURY:
  13. car = new LuxuryCar();
  14. break;
  15. default:
  16. // throw some exception
  17. break;
  18. }
  19. return car;
  20. }
  21. }

2.4 测试工厂模式

TestFactoryPattern中,我们将测试我们的工厂代码。 让我们运行这个类。

  1. package designPatterns.creational.factory;
  2. public class TestFactoryPattern {
  3. public static void main(String[] args) {
  4. System.out.println(CarFactory.buildCar(CarType.SMALL));
  5. System.out.println(CarFactory.buildCar(CarType.SEDAN));
  6. System.out.println(CarFactory.buildCar(CarType.LUXURY));
  7. }
  8. }

程序输出。

  1. Building small car
  2. designPatterns.creational.factory.SmallCar@7c230be4
  3. Building sedan car
  4. designPatterns.creational.factory.SedanCar@60e1e567
  5. Building luxury car
  6. designPatterns.creational.factory.LuxuryCar@e9bfee2

如您所见,工厂可以退回所要求的任何类型的汽车实例。 这将帮助我们在汽车制造过程中进行任何形式的更改,甚至无需触及组成类,即使用CarFactory的类。

3.工厂模式的好处

到目前为止,您应该能够算出使用工厂模式的主要优势。 让我们记下:

  1. 对象的创建可避免其重用,而无需大量重复代码。
  2. 创建对象需要访问不应包含在组成类中的信息或资源。
  3. 必须集中管理所生成对象的生命周期管理,以确保应用内行为的一致性。

4.最后的笔记

工厂模式最适合涉及一些复杂的对象创建步骤的地方。 为确保这些步骤集中进行,并且不暴露于编写类中,应使用工厂模式。 我们可以在 JDK 本身中看到许多实时的工厂模式示例,例如:

希望我在此 Java 工厂模式示例中包含了足够的信息,以使该帖子内容丰富。

如果您对 Java 中的抽象工厂设计模式仍有疑问,请发表评论。 我很乐意与您讨论。

学习愉快!