在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
工厂模式引入了类之间的松散耦合,这是设计应用程序架构时应该考虑和应用的最重要的原则。通过针对抽象实体而不是具体实现进行编程,可以在应用程序体系结构中引入松散耦合。这不仅使我们的架构更加灵活,而且不那么脆弱。
一张图片胜过千言万语。让我们看看工厂实现的样子。
上面的类图使用一个汽车工厂的例子描述了一个常见的场景,该工厂能够制造 3 种类型的汽车,即小型汽车、轿车和豪华汽车。制造一辆汽车需要从分配配件到最终组装的许多步骤。这些步骤可以在编程中编写为方法,并且应该在创建特定汽车类型的实例时调用。
如果不幸的话,我们将在我们的应用程序类中创建汽车类型的实例(例如 SmallCar
),因此我们会将汽车构建逻辑暴露给外界,这当然不好。这也阻止了我们对汽车制造过程进行更改,因为代码不是集中的,并且在所有组成类中进行更改似乎是不可行的。
到目前为止,我们已经设计了制作 CarFactory 所需的类。让我们现在创建它们。
CarType
将保存汽车类型并将汽车类型提供给所有其他类。
package designPatterns.creational.factory; public enum CarType { SMALL, SEDAN, LUXURY }
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("Building luxury car"); // 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("Building small car"); // 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("Building sedan car"); // add accessories } }
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; } }
在 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
的类。
到目前为止,您应该能够数出使用工厂模式的主要优势。我们记下来:
工厂模式最适合涉及一些复杂对象创建步骤的地方。为了确保这些步骤是集中的并且不暴露给组合类,应该使用工厂模式。我们可以在 JDK 本身中看到许多工厂模式的实时示例,例如
我希望,我在这个 Java 工厂模式示例 中包含了足够的信息,以使这篇文章内容丰富。
如果您对 Java 中的抽象工厂设计模式还有疑问,请发表评论。我很乐意与您讨论。
快乐学习!!
地址:https://www.cundage.com/article/implementing-factory-design-pattern-in-java.html