Java工厂模式详解:方法工厂模式与抽象工厂模式

news/2024/11/14 12:53:40/

Java工厂模式详解:方法工厂模式与抽象工厂模式

一、引言

在Java开发中,设计模式是解决常见软件设计问题的一种有效方式。工厂模式作为创建型设计模式的一种,提供了灵活的对象创建机制,有助于降低代码的耦合度,提高系统的可维护性和可扩展性。本文将详细介绍Java中的方法工厂模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)。

二、方法工厂模式

2.1 定义

方法工厂模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。

2.2 结构

方法工厂模式主要包含以下几个角色:

  • 抽象工厂角色(Creator):声明了工厂方法,用于返回一个产品对象。
  • 具体工厂角色(Concrete Creator):实现了抽象工厂角色中的工厂方法,用于返回一个具体的产品对象。
  • 抽象产品角色(Product):定义了产品的接口,是工厂方法所创建对象的超类型,也就是产品对象的共同接口。
  • 具体产品角色(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂角色创建,客户端通过抽象产品角色使用具体产品。

2.3 优点

  • 可扩展性:当需要增加新的产品时,只需要增加相应的具体产品类和具体工厂类,无需修改现有代码。
  • 解耦:将产品的创建与使用分离,客户端只需要知道产品接口,而无需知道具体产品的类名。

2.4 缺点

  • 增加类的数量:每增加一个产品,都需要增加一个具体产品类和一个具体工厂类,增加了系统的复杂性。

2.5 代码示例

java">// 抽象产品角色
public interface Product {void doSomething();
}// 具体产品A
public class ProductA implements Product {@Overridepublic void doSomething() {System.out.println("A do Something");}
}// 具体产品B
public class ProductB implements Product {@Overridepublic void doSomething() {System.out.println("B do Something");}
}// 抽象工厂角色
public abstract class Factory {abstract Product create();
}// 具体工厂A
public class FactoryA extends Factory {@OverrideProduct create() {return new ProductA();}
}// 具体工厂B
public class FactoryB extends Factory {@OverrideProduct create() {return new ProductB();}
}// 客户端代码
public class Client {public static void main(String[] args) {Factory factory = new FactoryA();Product product = factory.create();product.doSomething();factory = new FactoryB();product = factory.create();product.doSomething();}
}

三、抽象工厂模式

3.1 定义

抽象工厂模式(Abstract Factory Pattern)提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

3.2 结构

抽象工厂模式主要包含以下几个角色:

  • 抽象工厂角色(Abstract Factory):声明了一组用于创建产品的抽象方法。
  • 具体工厂角色(Concrete Factory):实现了抽象工厂角色中的抽象方法,用于创建具体的产品对象。
  • 抽象产品角色(Abstract Product):定义了产品的接口,是工厂方法所创建对象的超类型。
  • 具体产品角色(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂角色创建。

3.3 优点

  • 封装性:客户端只需要知道产品的抽象类型,无需关心具体产品的实现细节。
  • 可扩展性:当需要增加新的产品族时,只需要增加相应的具体产品类和具体工厂类,无需修改现有代码。
  • 灵活性:可以在不修改客户端代码的情况下更换产品族。

3.4 缺点

  • 增加系统的复杂性:由于涉及到多个抽象层,增加了系统的理解和维护难度。

3.5 代码示例

java">// 抽象产品A
public interface Engine {void run();void start();
}// 具体产品A1
public class LuxuryEngine implements Engine {@Overridepublic void run() {System.out.println("转的快");}@Overridepublic void start() {System.out.println("启动快!可以自动启停!");}
}// 抽象产品B
public interface Seat {void massage();
}// 具体产品B1
public class LuxurySeat implements Seat {@Overridepublic void massage() {System.out.println("可以自动按摩");}
}// 抽象工厂角色
public interface CarFactory {Engine createEngine();Seat createSeat();
}// 具体工厂A
public class LuxuryCarFactory implements CarFactory {@Overridepublic Engine createEngine() {return new LuxuryEngine();}@Overridepublic Seat createSeat() {return new LuxurySeat();}
}// 客户端代码
public class Client {public static void main(String[] args) {CarFactory factory = new LuxuryCarFactory();Engine engine = factory.createEngine();engine.run();engine.start();Seat seat = factory.createSeat();seat.massage();}
}

四、总结

方法工厂模式和抽象工厂模式都是用于创建对象的设计模式,但它们的应用场景和侧重点不同。方法工厂模式侧重于单个对象的创建,通过子类决定实例化哪个类;而抽象工厂模式则侧重于创建一系列相关或相互依赖的对象,通过接口来定义一组产品的创建方法。在实际开发中,应根据具体需求选择合适的设计模式


http://www.ppmy.cn/news/1501409.html

相关文章

c生万物系列(封装)

为了对c语言进行封装,笔者参考了lw_oopc等开源库,决定使用宏对结构体进行封装。 先说一下大致思想:通过宏,结构体和文件来实现封装。 大概步骤:抽象出类-> 使用lw_oopc库进行封装->定义接口封装底层实现 ->…

Canvas 的进度条操作及代码

canvas需要进度条么?答案显然是肯定的。我们的页面如果放到服务器上,图片的下载将是相当漫长的一个过程。如果我们不进行预加载就开始执行动画的话,那么用户肯定看不到理想的效果。 今天和大家探讨canvas动画框架之图片预加载,如上…

【音视频】RTSP、RTMP与流式传输

文章目录 前言RTSP与RTMPRTSP(Real-Time Streaming Protocol)RTMP(Real-Time Messaging Protocol)主要差异 什么是流式传输?流式传输的特点流式传输与传统下载的区别 使用VLC播放RTSP监控 总结 前言 在现代网络环境中…

【解决方案】华普微汽车智能钥匙解决方案

一、方案概述 1.什么是被动式无钥匙进入 "被动式无钥匙进入"(Passive Keyless Entry)是一种用于车辆、建筑物或其他设施的访问控制系统。它利用无线射频技术自动判断用户是否接近,并进行身份识别以执行开锁或落锁动作&#xff0c…

VSCode 命令行使用 git commit 无法输入中文

1. 问题描述 在使用 VSCode 的集成终端(Terminal)进行 git commit -m feat:xxx 操作时,发现 xxx 的位置只能编写英文,无法输入中文或者输入中文后出现问题。 这通常与终端编码设置、VSCode 的配置或者操作系统设置有…

InternLM-L0 Python作业

任务类型 任务内容 闯关任务 Python实现wordcount 闯关任务 Vscode连接InternStudio debug笔记 1. Python实现wordcount 基于作业 InternLM-L0 linux作业 ,创建Python文件输入如下代码,并用Python 脚本运行: text """ Go…

BCH码误码率ber性能仿真(MATLAB)

BCH码 不同于奇偶校验码只能检验数据传输是否出错,BCH码可以实现对数据的检验和纠错 BCH(n,k)中的n代表总码元,k代表有效码元,相应的n-k即代表纠错码元 本文着重比较分析BCH(255,207),BCH(255,131),BCH(255…

【redis】一致性hash算法和hash槽

普通hash取模 直接hash(key)%N , N为机器的数量,但不利于集器扩容或者缩容 一致性hash算法和hash槽 一致性hash算法是在redis 分片中使用,hash槽在redis cluster(集群)中使用 Redis一致性hash:Redis一致性hash是为…