概述本文将解释JAVA中的工厂设计模式:工厂方法和抽象工厂 , 并用实际例子来说明如何实现该模式 。
工厂方法模式比如为一家汽车制造商开发一款应用程序 。起初 , 该客户制造的车辆仅使用燃油发动机 。因此 , 为了遵循单一责任原则(SRP)和开闭原则(OCP) , 我们使用工厂方法设计模式 。
文章插图
工厂方法模式通过将产品的构造代码与使用该产品的代码分离来解耦合 。
首先 , 在我们的示例应用程序中 , 定义了MotorVehicle接口 。这个接口只有一个方法build() , 用于制造特定的机动车辆:
public interface MotorVehicle {void build();}
下一步是实现MotorVehicle接口的具体类 。我们创造了两种类型:摩托车和汽车:public class Motorcycle implements MotorVehicle {@Overridepublic void build() {System.out.println("Build Motorcycle");}}public class Car implements MotorVehicle {@Overridepublic void build() {System.out.println("Build Car");}}
然后 , 我们创建MotorVehicleFactory类 。这个类负责创建每个新的车辆实例 。它是一个抽象类 , 因为它为特定的工厂制造特定的车辆:public abstract class MotorVehicleFactory {public MotorVehicle create() {MotorVehicle vehicle = createMotorVehicle();vehicle.build();return vehicle;}protected abstract MotorVehicle createMotorVehicle();}
方法create()调用抽象方法createMotorVehicle()来创建特定类型的机动车辆 , 之前我们具有两种类型的摩托车和汽车:【一篇读懂Java工厂设计模式】
public class MotorcycleFactory extends MotorVehicleFactory {@Overrideprotected MotorVehicle createMotorVehicle() {return new Motorcycle();}}public class CarFactory extends MotorVehicleFactory {@Overrideprotected MotorVehicle createMotorVehicle() {return new Car();}}
我们的应用程序是使用工厂方法模式设计 , 现在就可以随心所欲地增加新的机动车辆 。最后 , 我们看看使用UML表示法的最终设计是什么样子的:文章插图
抽象工厂模式比如两家新的汽车品牌公司对我们上面设计的系统感兴趣:NextGen和FutureVehicle 。这些新公司不仅生产纯燃料汽车 , 还生产电动汽车 。每家公司都有自己的汽车设计 , 为了解决这些问题 , 我们可以使用抽象工厂模式 , 将产品创建代码集中在一个地方 。UML表示为:
文章插图
我们已经有了MotorVehicle接口 。此外 , 必须添加一个接口来表示电动汽车:
public interface ElectricVehicle {void build();}
接下来 , 我们创建抽象工厂 。该类是抽象的 , 因为创建对象的责任将由具体工厂承担 。这种行为遵循OCP和SRP:public abstract class Corporation {public abstract MotorVehicle createMotorVehicle();public abstract ElectricVehicle createElectricVehicle();}
FutureVehicle公司生产的车辆:public class FutureVehicleMotorcycle implements MotorVehicle {@Overridepublic void build() {System.out.println("Future Vehicle Motorcycle");}}public class FutureVehicleElectricCar implements ElectricVehicle {@Overridepublic void build() {System.out.println("Future Vehicle Electric Car");}}
NexGen公司做了同样的事情:public class NextGenMotorcycle implements MotorVehicle {@Overridepublic void build() {System.out.println("NextGen Motorcycle");}}public class NextGenElectricCar implements ElectricVehicle {@Overridepublic void build() {System.out.println("NextGen Electric Car");}}
FutureVehicle工厂:public class FutureVehicleCorporation extends Corporation {@Overridepublic MotorVehicle createMotorVehicle() {return new FutureVehicleMotorcycle();}@Overridepublic ElectricVehicle createElectricVehicle() {return new FutureVehicleElectricCar();}}
接下来是另一个NexGen工厂:public class NextGenCorporation extends Corporation {@Overridepublic MotorVehicle createMotorVehicle() {return new NextGenMotorcycle();}@Overridepublic ElectricVehicle createElectricVehicle() {return new NextGenElectricCar();}}
我们使用抽象工厂模式完成了实现 。以下是我们自定义实现的UML图:文章插图
推荐阅读
- 看动图学算法:冒泡排序算法的原理和Java讲解
- 福建省|《山海经》之《山经》第一篇——?山山系地理志
- 从Java源码来看Native命令执行方法
- 读懂这7个问答,你会试着与人生和解
- JS混淆加密应用场景有哪些?
- 一篇带你学习Kubernetes Descheduler 使用
- JavaScript日期处理不再难!Day.js带你飞!
- Google称内部全在用Kotlin搞安卓开发,体验碾压Java
- 深入探究Java IO流:基础知识、流类型及使用方法
- 深入理解Java中hashCode的作用