【精选】设计模式——工厂设计模式

这篇具有很好参考价值的文章主要介绍了【精选】设计模式——工厂设计模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工厂设计模式是一种创建型设计模式,其主要目的是通过将对象的创建过程封装在一个工厂类中来实现对象的创建。这样可以降低客户端与具体产品类之间的耦合度,也便于代码的扩展和维护。
【精选】设计模式——工厂设计模式,设计模式学习,设计模式,java,jvm,spring
【精选】设计模式——工厂设计模式,设计模式学习,设计模式,java,jvm,spring

工厂设计模式:

以下是Java中两个常见的工厂设计模式示例:
【精选】设计模式——工厂设计模式,设计模式学习,设计模式,java,jvm,spring

1. 简单工厂模式

【精选】设计模式——工厂设计模式,设计模式学习,设计模式,java,jvm,spring

简单工厂模式又称静态工厂模式,通过一个工厂类统一创建各种不同类型的产品对象。下面以创建不同形状的图形为例。

// 定义图形接口
interface Shape {
    void draw();
}

// 实现具体图形类
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle.");
    }
}

class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle.");
    }
}

class Triangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a triangle.");
    }
}

// 简单工厂类
class ShapeFactory {
    // 根据传入参数创建对应的图形对象
    public static Shape createShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("circle")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("rectangle")) {
            return new Rectangle();
        } else if (shapeType.equalsIgnoreCase("triangle")) {
            return new Triangle();
        }
        return null;
    }
}

// 使用示例
public class SimpleFactoryExample {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.createShape("circle");
        circle.draw(); // 输出:Drawing a circle.

        Shape rectangle = ShapeFactory.createShape("rectangle");
        rectangle.draw(); // 输出:Drawing a rectangle.

        Shape triangle = ShapeFactory.createShape("triangle");
        triangle.draw(); // 输出:Drawing a triangle.
    }
}

2. 工厂方法模式

工厂方法模式定义了一个创建对象的接口,但具体由子类决定实例化哪个类。下面以创建不同类型的日志记录器为例。

// 定义日志记录器接口
interface Logger {
    void log(String message);
}

// 实现具体日志记录器类
class FileLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("Writing log to file: " + message);
    }
}

class ConsoleLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("Writing log to console: " + message);
    }
}

// 抽象工厂类
abstract class LoggerFactory {
    // 创建日志记录器对象
    public abstract Logger createLogger();
}

// 具体工厂类,用于创建文件日志记录器
class FileLoggerFactory extends LoggerFactory {
    @Override
    public Logger createLogger() {
        return new FileLogger();
    }
}

// 具体工厂类,用于创建控制台日志记录器
class ConsoleLoggerFactory extends LoggerFactory {
    @Override
    public Logger createLogger() {
        return new ConsoleLogger();
    }
}

// 使用示例
public class FactoryMethodExample {
    public static void main(String[] args) {
        LoggerFactory fileLoggerFactory = new FileLoggerFactory();
        Logger fileLogger = fileLoggerFactory.createLogger();
        fileLogger.log("Error occurred."); // 输出:Writing log to file: Error occurred.

        LoggerFactory consoleLoggerFactory = new ConsoleLoggerFactory();
        Logger consoleLogger = consoleLoggerFactory.createLogger();
        consoleLogger.log("Warning."); // 输出:Writing log to console: Warning.
    }
}

好的,下面继续介绍另外两个常见的工厂设计模式示例:

3. 抽象工厂模式

抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。下面以创建不同操作系统的界面组件为例。

// 定义操作系统界面组件接口
interface Button {
    void render();
}

interface TextField {
    void render();
}

// 实现Windows操作系统界面组件
class WindowsButton implements Button {
    @Override
    public void render() {
        System.out.println("Rendering a Windows button.");
    }
}

class WindowsTextField implements TextField {
    @Override
    public void render() {
        System.out.println("Rendering a Windows text field.");
    }
}

// 实现Mac操作系统界面组件
class MacButton implements Button {
    @Override
    public void render() {
        System.out.println("Rendering a Mac button.");
    }
}

class MacTextField implements TextField {
    @Override
    public void render() {
        System.out.println("Rendering a Mac text field.");
    }
}

// 抽象工厂接口
interface GUIFactory {
    Button createButton();
    TextField createTextField();
}

// 具体工厂类,用于创建Windows风格的界面组件
class WindowsGUIFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public TextField createTextField() {
        return new WindowsTextField();
    }
}

// 具体工厂类,用于创建Mac风格的界面组件
class MacGUIFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public TextField createTextField() {
        return new MacTextField();
    }
}

// 使用示例
public class AbstractFactoryExample {
    public static void main(String[] args) {
        // 创建Windows风格的界面组件
        GUIFactory windowsFactory = new WindowsGUIFactory();
        Button windowsButton = windowsFactory.createButton();
        windowsButton.render(); // 输出:Rendering a Windows button.
        TextField windowsTextField = windowsFactory.createTextField();
        windowsTextField.render(); // 输出:Rendering a Windows text field.

        // 创建Mac风格的界面组件
        GUIFactory macFactory = new MacGUIFactory();
        Button macButton = macFactory.createButton();
        macButton.render(); // 输出:Rendering a Mac button.
        TextField macTextField = macFactory.createTextField();
        macTextField.render(); // 输出:Rendering a Mac text field.
    }
}

抽象工厂模式可以创建一系列相关的产品对象,例如上述示例中的不同操作系统的界面组件。使用此模式可以确保所创建的产品对象是相互配套的。

4. 单例工厂模式

单例工厂模式通过工厂类控制只创建一个对象实例,供客户端使用。下面以创建数据库连接对象为例。

// 数据库连接类
class DBConnection {
    private static DBConnection instance;

    // 私有构造函数,防止通过new关键字创建实例
    private DBConnection() {}

    public static synchronized DBConnection getInstance() {
        if (instance == null) {
            instance = new DBConnection();
        }
        return instance;
    }

    public void connect() {
        System.out.println("Connecting to the database...");
    }
}

// 使用示例
public class SingletonFactoryExample {
    public static void main(String[] args) {
        DBConnection connection1 = DBConnection.getInstance();
        connection1.connect(); // 输出:Connecting to the database...

        DBConnection connection2 = DBConnection.getInstance();
        connection2.connect(); // 输出:Connecting to the database...

        System.out.println(connection1 == connection2); // 输出:true,表示只创建了一个实例
    }
}

单例工厂模式确保在整个应用程序中只有一个实例被创建和共享,避免了多次创建相同对象的开销,并且能够提供全局访问点以便于其他对象使用。

工厂设计模式具有以下优点:

  1. 解耦客户端和具体产品类:工厂类负责对象的创建,客户端只需要通过工厂类获取所需的对象,无需直接与具体产品类交互,从而降低了客户端与具体产品类之间的耦合度。
  2. 代码的扩展性和维护性好:当需要增加新的产品时,只需添加相应的产品类和对应的工厂方法即可,不需要修改已有的代码,符合开闭原则(对扩展开放,对修改关闭)。
  3. 更好地封装和隐藏了对象的创建过程:客户端无需关心对象的创建细节,只需调用工厂类的方法即可得到所需的对象。
  4. 提高了程序的可扩展性:通过工厂类统一创建对象,可以方便地切换产品系列或者替换具体的工厂类,符合依赖倒置原则。

然而,工厂设计模式也存在一些缺点:

  1. 增加了系统的复杂度:引入工厂类会增加系统的类和对象数量,增加了代码量和理解难度。
  2. 不够灵活:由于工厂类负责对象的创建,如果需要创建具有不同特性的对象,可能需要修改工厂类的代码,违反了开闭原则。
  3. 难以扩展新的产品族:当需要扩展一个新的产品族时,需要修改工厂类的代码,违反了开闭原则。

因此,在使用工厂设计模式时需要根据实际情况权衡其优缺点,并选择最适合的设计方案。

除了上述列举的几种工厂设计模式,还有一些其他的变体和衍生形式:

  1. 多个工厂方法:某些情况下,可以在抽象工厂类中定义多个工厂方法,每个工厂方法分别用于创建不同类型的产品对象。这样可以更加灵活地处理不同类型的产品。
  2. 延迟初始化工厂:在工厂类中使用延迟初始化技术,只有在需要时才创建具体产品对象。这样可以节省系统资源,提高性能。
  3. 反射工厂:通过Java反射机制,根据传入的类名动态创建对象。这种方式可以在运行时动态地创建对象,灵活性更高。
  4. 简单工厂与抽象工厂结合:有时候可以将简单工厂和抽象工厂结合使用,以实现更复杂的对象创建过程。例如,在抽象工厂中定义一个工厂方法来创建简单工厂,然后再由简单工厂负责创建具体产品对象。

无论是哪种工厂设计模式,都要根据实际需求选择合适的方案。工厂设计模式在许多软件系统中都得到了广泛应用,它们能够提供良好的代码结构、可扩展性和灵活性,使得系统更易于维护和拓展。文章来源地址https://www.toymoban.com/news/detail-759736.html

到了这里,关于【精选】设计模式——工厂设计模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring5深入浅出篇:Spring与工厂设计模式简介

    轻量级 JavaEE的解决⽅案 spring实际上就是对原有设计模式的一种高度封装和整合 整合设计模式 工厂设计模式 什么是工厂设计模式 当UserServiceImpl发生变化是会影响到userService等相关联的类,在线上环境不利于维护

    2024年01月18日
    浏览(45)
  • Java设计模式-抽象工厂模式

    设计模式是软件设计中的一种常见方法,通过定义一系列通用的解决方案,来解决常见的软件设计问题。其中,抽象工厂模式是一种非常常见的设计模式,它可以帮助我们创建一组相关的对象,而不需要指定具体的实现方式。 抽象工厂模式是一种创建型设计模式,它提供了一

    2024年02月01日
    浏览(28)
  • java设计模式-工厂方法模式

    定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程; 在系统增加新的产品时只需要添加

    2024年02月04日
    浏览(34)
  • Java设计模式 (二) 工厂模式

    什么是工厂模式? 工厂模式是一种创建型设计模式,它提供了一种统一的方式来创建对象,隐藏了对象的创建细节,使客户端代码与具体类的实例化过程解耦。工厂模式可以帮助您在不暴露对象创建细节的情况下实例化对象,从而提高代码的灵活性和可维护性。 工厂模式通常

    2024年02月12日
    浏览(25)
  • java设计模式【工厂方法模式】

    工厂方法模式 ( FACTORY METHOD )是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;

    2024年02月05日
    浏览(46)
  • java设计模式【抽象工厂模式】

    抽象工厂模式 是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类。在这个模式中,我们只关心产品的抽象接口,而将具体的产品实现留给子类去实现。这样,我们可以通过创建不同的工厂对象来创建不同的产品实例,而

    2024年02月05日
    浏览(36)
  • 学习笔记-设计模式-创建型模式-工厂模式

    工厂模式是一种创建者设计模式,细分之下可以分成三类 简单工厂模式 , 工厂方法模式 和 抽象工厂模式 。 简单工厂模式 最简单的工厂模式,它采用静态方法的方式来决定应该应该生产什么商品。 它的优点在于 将创建实例的工作与使用实例的工作分开,使用者不必关心类

    2024年02月10日
    浏览(28)
  • Java设计模式---单例 工厂 代理模式

    单例模式是设计模式中的一种,属于创建型模式。在软件工程中,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于那些需要频繁实例化然后引用,且创建新实例的开销较大的类,例如数据库连接池、缓存管理等。 意图 :保证一个类仅有一个实例

    2024年01月24日
    浏览(39)
  • 【java设计模式】创建型模式介绍(工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式)

    简介 本文介绍Java设计模式中创建型模式的五种 一、工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工

    2024年02月16日
    浏览(40)
  • Java工厂设计模式

    工厂设计模式是一种创建型设计模式,它允许你创建对象,但不暴露其创建逻辑。该模式定义了一个工厂类,该类负责创建对象。这样,客户端代码只需知道如何与工厂交互,而不必知道对象的实际创建方式。 下面是工厂设计模式的通用结构:

    2024年02月07日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包