• 详细讲解什么是工厂模式


    当我们谈论工厂模式时,我们实际上是在讨论一种创建对象的设计模式。工厂模式的目的是封装对象的创建过程,并将其交给一个单独的工厂类来处理。这种方式有助于解耦对象的创建和使用,使得系统更加灵活、可维护。

    有三种主要的工厂模式:简单工厂模式、工厂方法模式和抽象工厂模式。

    简单工厂模式:


    简单工厂模式是一种创建型设计模式,它提供了一个简单的工厂类,该工厂类负责根据给定的条件创建对象。这个模式通常包括以下几个角色:

    1. 产品接口(Product Interface): 定义了产品的接口或抽象类。

    2. 具体产品(Concrete Product): 实现了产品接口的具体类。

    3. 工厂类(Factory Class): 包含一个方法,根据输入条件创建并返回具体产品的实例。

    下面是一个简单的例子,假设我们有一个形状接口 Shape 和两个具体的形状类 CircleSquare

    1. // 1. 产品接口
    2. interface Shape {
    3. void draw();
    4. }
    5. // 2. 具体产品类
    6. class Circle implements Shape {
    7. @Override
    8. public void draw() {
    9. System.out.println("绘制圆形");
    10. }
    11. }
    12. class Square implements Shape {
    13. @Override
    14. public void draw() {
    15. System.out.println("绘制正方形");
    16. }
    17. }
    18. // 3. 工厂类
    19. class ShapeFactory {
    20. // 工厂方法,根据输入条件创建并返回具体产品的实例
    21. public Shape createShape(String shapeType) {
    22. if ("Circle".equalsIgnoreCase(shapeType)) {
    23. return new Circle();
    24. } else if ("Square".equalsIgnoreCase(shapeType)) {
    25. return new Square();
    26. } else {
    27. throw new IllegalArgumentException("无法创建该形状类型");
    28. }
    29. }
    30. }

    使用简单工厂模式的客户端代码如下:

    1. public class Client {
    2. public static void main(String[] args) {
    3. // 创建工厂实例
    4. ShapeFactory shapeFactory = new ShapeFactory();
    5. // 通过工厂创建具体产品实例
    6. Shape circle = shapeFactory.createShape("Circle");
    7. Shape square = shapeFactory.createShape("Square");
    8. // 调用产品的方法
    9. circle.draw();
    10. square.draw();
    11. }
    12. }

    在这个例子中,ShapeFactory 是工厂类,负责根据输入的字符串条件创建相应的形状对象。这样,客户端代码不需要直接实例化具体的形状类,而是通过工厂类来获取所需的对象,从而达到解耦的效果。

    工厂方法模式(Factory Method Pattern):


    工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定要实例化的类。换句话说,工厂方法模式将对象的实例化推迟到子类中进行。

    角色:

    1. 抽象产品接口(Product Interface): 定义了产品的接口或抽象类。

    2. 具体产品类(Concrete Product): 实现了产品接口的具体类。

    3. 抽象工厂类(Creator): 声明了创建产品的工厂方法,可以包含一些默认的实现。

    4. 具体工厂类(Concrete Creator): 实现了抽象工厂类,负责实际创建具体产品的实例。

    下面是一个简单的例子,假设我们有一个抽象的日志接口 Logger 和两个具体的日志类 FileLoggerConsoleLogger

    1. // 1. 抽象产品接口
    2. interface Logger {
    3. void logMessage(String message);
    4. }
    5. // 2. 具体产品类
    6. class FileLogger implements Logger {
    7. @Override
    8. public void logMessage(String message) {
    9. System.out.println("写入日志到文件: " + message);
    10. }
    11. }
    12. class ConsoleLogger implements Logger {
    13. @Override
    14. public void logMessage(String message) {
    15. System.out.println("在控制台打印日志: " + message);
    16. }
    17. }
    18. // 3. 抽象工厂类
    19. abstract class LoggerFactory {
    20. // 工厂方法,由子类实现,用于创建具体产品实例
    21. public abstract Logger createLogger();
    22. }
    23. // 4. 具体工厂类
    24. class FileLoggerFactory extends LoggerFactory {
    25. @Override
    26. public Logger createLogger() {
    27. return new FileLogger();
    28. }
    29. }
    30. class ConsoleLoggerFactory extends LoggerFactory {
    31. @Override
    32. public Logger createLogger() {
    33. return new ConsoleLogger();
    34. }
    35. }

    使用工厂方法模式的客户端代码如下:

    1. public class Client {
    2. public static void main(String[] args) {
    3. // 创建具体工厂实例
    4. LoggerFactory fileLoggerFactory = new FileLoggerFactory();
    5. LoggerFactory consoleLoggerFactory = new ConsoleLoggerFactory();
    6. // 使用具体工厂创建具体产品实例
    7. Logger fileLogger = fileLoggerFactory.createLogger();
    8. Logger consoleLogger = consoleLoggerFactory.createLogger();
    9. // 调用产品的方法
    10. fileLogger.logMessage("这是一个文件日志");
    11. consoleLogger.logMessage("这是一个控制台日志");
    12. }
    13. }

    在工厂方法模式中,具体产品的创建由具体工厂类决定,这样就可以轻松地扩展和变化产品系列,同时保持客户端代码的稳定性。

    抽象工厂模式(Abstract Factory Pattern):


    抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象的家族,而不需要指定它们的具体类。抽象工厂模式是工厂方法模式的升级版,它引入了多个工厂方法,每个工厂方法负责创建一组相关的产品。

    角色:

    1. 抽象产品接口(Abstract Product Interface): 定义了一组产品的接口或抽象类。

    2. 具体产品类(Concrete Product): 实现了产品接口的具体类。

    3. 抽象工厂接口(Abstract Factory): 声明了一组创建产品的抽象方法,每个方法对应一个产品。

    4. 具体工厂类(Concrete Factory): 实现了抽象工厂接口,负责创建一组相关的产品。

    下面是一个简单的Java抽象工厂模式的实例,假设我们有两个产品家族:电脑和手机,每个家族有两个具体产品:台式电脑、笔记本电脑、智能手机和功能手机。

    1. // 抽象产品接口
    2. interface Computer {
    3. void show();
    4. }
    5. interface Phone {
    6. void display();
    7. }
    8. // 具体产品实现
    9. class DesktopComputer implements Computer {
    10. @Override
    11. public void show() {
    12. System.out.println("Desktop Computer");
    13. }
    14. }
    15. class LaptopComputer implements Computer {
    16. @Override
    17. public void show() {
    18. System.out.println("Laptop Computer");
    19. }
    20. }
    21. class Smartphone implements Phone {
    22. @Override
    23. public void display() {
    24. System.out.println("Smartphone");
    25. }
    26. }
    27. class FeaturePhone implements Phone {
    28. @Override
    29. public void display() {
    30. System.out.println("Feature Phone");
    31. }
    32. }
    33. // 抽象工厂接口
    34. interface ElectronicsFactory {
    35. Computer createComputer();
    36. Phone createPhone();
    37. }
    38. // 具体工厂实现
    39. class DellFactory implements ElectronicsFactory {
    40. @Override
    41. public Computer createComputer() {
    42. return new DesktopComputer();
    43. }
    44. @Override
    45. public Phone createPhone() {
    46. return new Smartphone();
    47. }
    48. }
    49. class LenovoFactory implements ElectronicsFactory {
    50. @Override
    51. public Computer createComputer() {
    52. return new LaptopComputer();
    53. }
    54. @Override
    55. public Phone createPhone() {
    56. return new FeaturePhone();
    57. }
    58. }
    59. // 客户端
    60. public class Client {
    61. public static void main(String[] args) {
    62. // 使用Dell工厂创建产品
    63. ElectronicsFactory dellFactory = new DellFactory();
    64. Computer dellComputer = dellFactory.createComputer();
    65. Phone dellPhone = dellFactory.createPhone();
    66. dellComputer.show();
    67. dellPhone.display();
    68. // 使用Lenovo工厂创建产品
    69. ElectronicsFactory lenovoFactory = new LenovoFactory();
    70. Computer lenovoComputer = lenovoFactory.createComputer();
    71. Phone lenovoPhone = lenovoFactory.createPhone();
    72. lenovoComputer.show();
    73. lenovoPhone.display();
    74. }
    75. }

            在这个例子中,ComputerPhone 是抽象产品接口,DesktopComputerLaptopComputerSmartphoneFeaturePhone 是具体产品的实现。ElectronicsFactory 是抽象工厂接口,DellFactoryLenovoFactory 是具体工厂的实现。

    客户端通过具体工厂来创建产品,而无需关心产品的具体实现。这样,如果需要更改产品的实现,只需更改具体工厂的实现,而客户端代码保持不变,实现了对象的创建和使用之间的解耦。

  • 相关阅读:
    Java算术运算符
    【无标题】
    你了解的SpringCloud核心组件有哪些?他们各有什么作用?
    如何使用 Node.js和Express搭建服务器?
    RPA的尽头是超自动化?
    榕树贷款GPU 硬件架构
    SpringBoot测试实践
    高速电路逻辑电平转换设计
    李峋同款会动的爱心Python代码版
    合伙保密协议
  • 原文地址:https://blog.csdn.net/qq_52645134/article/details/134496029