Java 工厂模式解释

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(406)   2023-06-26 07:54:18

在java中创建类实例的最常用方法是什么?大多数人会回答这个问题:“使用新关键字”。好吧,它现在被认为是过时的。看看怎么样??

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

在我之前的帖子中,“Java 中的单例设计模式< /a>”,我们讨论了创建类实例的各种方法,使得同一个 JVM 中不能存在同一个类的另一个实例。

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

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

Table of Contents

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

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

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

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

class_diagram_of_factory_pattern_in_java1-8964987

上面的类图使用一个汽车工厂的例子描述了一个常见的场景,该工厂能够制造 3 种类型的汽车,即小型汽车、轿车和豪华汽车。制造一辆汽车需要从分配配件到最终组装的许多步骤。这些步骤可以在编程中编写为方法,并且应该在创建特定汽车类型的实例时调用。

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

2. Java 工厂模式示例

到目前为止,我们已经设计了制作 CarFactory 所需的类。让我们现在创建它们。

2.1.对象类型

CarType 将保存汽车类型并将汽车类型提供给所有其他类。

package designPatterns.creational.factory;

public enum CarType {
    SMALL, SEDAN, LUXURY
}

2.2.对象实现

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

package designPatterns.creational.factory;

public abstract class Car {

	public Car(CarType model) {
		this.model = model;
		arrangeParts();
	}

	private void arrangeParts() {
		// Do one time processing here
	}

	// Do subclass level processing in this method
	protected abstract void construct();

	private CarType model = null;

	public CarType getModel() {
		return model;
	}

	public void setModel(CarType model) {
		this.model = model;
	}
}

LuxuryCar 是汽车类型LUXURY 的具体实现。

package designPatterns.creational.factory;

public class LuxuryCar extends Car {

	LuxuryCar() {
		super(CarType.LUXURY);
		construct();
	}

	@Override
	protected void construct() {
		System.out.println(&quot;Building luxury car&quot;);
		// add accessories
	}
}

SmallCar 是汽车类型SMALL 的具体实现。

package designPatterns.creational.factory;

public class SmallCar extends Car {

	SmallCar() {
		super(CarType.SMALL);
		construct();
	}

	@Override
	protected void construct() {
		System.out.println(&quot;Building small car&quot;);
		// add accessories
	}
}

SedanCar 是汽车类型SEDAN 的具体实现。

package designPatterns.creational.factory;

public class SedanCar extends Car {

	SedanCar() {
		super(CarType.SEDAN);
		construct();
	}

	@Override
	protected void construct() {
		System.out.println(&quot;Building sedan car&quot;);
		// add accessories
	}
}

2.3.工厂创建对象

CarFactory.java 是我们使用工厂模式实现的主类。它仅在确定其类型后才实例化汽车实例。

package designPatterns.creational.factory;

public class CarFactory {
	public static Car buildCar(CarType model) {
		Car car = null;
		switch (model) {
		case SMALL:
			car = new SmallCar();
			break;

		case SEDAN:
			car = new SedanCar();
			break;

		case LUXURY:
			car = new LuxuryCar();
			break;

		default:
			// throw some exception
			break;
		}
		return car;
	}
}

2.4.测试工厂模式

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

package designPatterns.creational.factory;

public class TestFactoryPattern {
	public static void main(String[] args) {
		System.out.println(CarFactory.buildCar(CarType.SMALL));
		System.out.println(CarFactory.buildCar(CarType.SEDAN));
		System.out.println(CarFactory.buildCar(CarType.LUXURY));
	}
}

程序输出。

Building small car
designPatterns.creational.factory.SmallCar@7c230be4
Building sedan car
designPatterns.creational.factory.SedanCar@60e1e567
Building luxury car
designPatterns.creational.factory.LuxuryCar@e9bfee2

如您所见,工厂能够返回它所请求的任何类型的汽车实例。它将帮助我们在汽车制造过程中进行任何类型的更改,甚至无需触及组合类,即使用 CarFactory 的类。

3.工厂模式的好处

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

  1. 对象的创建排除了它的重用,而没有明显的代码重复。
  2. 对象的创建需要访问不应包含在组合类中的信息或资源。
  3. 必须集中管理生成的对象的生命周期,以确保应用程序内的行为一致。

4. 最后说明

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

我希望,我在这个 Java 工厂模式示例 中包含了足够的信息,以使这篇文章内容丰富。

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

快乐学习!!

地址:https://www.cundage.com/article/implementing-factory-design-pattern-in-java.html

相关阅读

在java中创建类实例的最常用方法是什么?大多数人会回答这个问题:“使用新关键字”。好吧,它现在被认为是过时的。看看怎么样?? 如果对象创建代码散布在整个应用程序中,并且如果您需要更改对象创建过...
Bridge design pattern 用于将一个类解耦为两个部分——抽象和它的实现——这样两者可以在未来发展而不会相互影响。它增加了类抽象与其实现之间的松散耦合。 将抽象与其实现分离,以便...
Camel Design Patterns 本书包含 20 种模式和大量的设计技术和最佳实践&lt; span style="font-weight: 400;"&gtl;Apache Came...
学习将正则表达式编译成java.util.function.Predicate。当您想对匹配的标记执行某些操作时,这会很有用。 将正则表达式转换为谓词 我有不同域的电子邮件列表,我只想对域名为“...
设计模式是用来解决出现问题的一种模式,大家都知道吧?我们还知道,行为设计模式 是识别对象之间常见通信模式的设计模式。其中一种行为模式是访问者模式,我们将在本文中了解它。 如果您一直在处理管理大量...
根据 GoF 的定义,中介者模式 定义了一个对象 封装一组对象如何交互。调解器通过防止对象相互显式引用来促进松散耦合,它让我们可以独立地改变它们的交互。 Mediator 是一种行为设计模式,也...
命令模式 是一种行为设计模式,有助于将业务逻辑抽象为离散的操作,我们称之为命令。此命令对象有助于两个类之间的松散耦合,其中一个类(调用者)应调用另一个类(接收者)上的方法来执行业务操作。 让我们...
原型是任何对象在构造实际对象之前的模板.在 java 中,它也具有相同的含义。原型设计模式用于应用程序需要创建一个类的多个实例的场景,这些实例具有几乎相同的状态或差异很小。 在这种设计模式中,实...
抽象工厂模式是另一种创造性设计模式,被认为是工厂模式的另一层抽象。在本教程中,我们将扩大工厂模式中讨论的汽车工厂问题的范围。我们将学习何时通过扩展汽车工厂的范围来使用工厂模式,然后学习抽象工厂模...
使用 String.split() 方法和使用 java.util.regex.Pattern 类将字符串转换为字符串数组的 Java 示例。 快速参考: //1. String to Stri...