【设计模式】创建型-工厂方法模式

前言

工厂方法模式是一种经典的创建型设计模式,它提供了一种灵活的方式来创建对象实例。通过本文,我们将深入探讨工厂方法模式的概念、结构和应用。

一、什么是工厂方法模式

工厂方法模式是一种创建型设计模式,旨在解决对象的创建过程和客户端代码之间的耦合问题。它将对象的创建委托给子类来决定,从而使得客户端代码不需要直接依赖于具体的对象类型,而是通过调用工厂方法来创建所需的对象。

二、工厂方法模式的核心组成部分

工厂方法模式的核心组成部分包括:

  1. 抽象产品(Abstract Product):定义了产品的接口或抽象类,它是工厂方法模式所创建对象的共同接口。具体的产品类将实现这个接口,从而实现产品的具体功能。
  2. 具体产品(Concrete Product):实现了抽象产品接口的具体类,是工厂方法模式所创建的对象实例。每个具体产品类都实现了抽象产品定义的操作,从而提供了产品的具体功能。
  3. 抽象工厂(Abstract Factory):定义了一个创建产品对象的接口,包含一个抽象工厂方法用于创建产品对象。通常是一个抽象类或接口,可以有多个子类来实现具体的工厂方法。
  4. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责实际创建产品对象的具体工厂类。每个具体工厂类都实现了抽象工厂定义的工厂方法,从而创建具体的产品对象。

在这里插入图片描述

工厂方法模式通过以上组成部分,将对象的创建委托给子类来决定,从而实现了对象的解耦合。客户端代码不需要直接依赖于具体的产品类,而是通过工厂方法来获取所需的产品实例,从而提高了代码的灵活性和可维护性。

三、运用工厂方法模式

场景假设:我们需要创建不同形状的图形,包括圆形和矩形。

  1. 定义抽象产品接口(Abstract Product):首先,我们定义一个抽象产品接口,该接口声明了产品对象的通用行为或功能。

    // 抽象产品接口
    interface Shape {
        void draw();
    }
    
  2. 创建具体产品类(Concrete Product):然后,我们创建具体的产品类,实现了抽象产品接口中声明的方法。

    // 具体产品类:圆形
    class Circle implements Shape {
        @Override
        public void draw() {
            System.out.println("Inside Circle::draw() method.");
        }
    }
    
    // 具体产品类:矩形
    class Rectangle implements Shape {
        @Override
        public void draw() {
            System.out.println("Inside Rectangle::draw() method.");
        }
    }
    
  3. 定义抽象工厂接口(Abstract Factory):接下来,我们定义一个抽象工厂接口,该接口声明了一个工厂方法用于创建产品对象。

    // 抽象工厂接口
    interface ShapeFactory {
        Shape createShape();
    }
    
  4. 创建具体工厂类(Concrete Factory):然后,我们创建具体的工厂类,实现了抽象工厂接口中的工厂方法。

    // 具体工厂类:圆形工厂
    class CircleFactory implements ShapeFactory {
        @Override
        public Shape createShape() {
            return new Circle();
        }
    }
    
    // 具体工厂类:矩形工厂
    class RectangleFactory implements ShapeFactory {
        @Override
        public Shape createShape() {
            return new Rectangle();
        }
    }
    
  5. 客户端使用工厂方法创建对象:最后,客户端代码通过具体工厂类调用工厂方法来创建产品对象。客户端代码不直接创建具体产品对象,而是通过工厂方法来获取所需的产品对象。这样客户端就不需要了解或依赖于具体的产品类,从而实现了对象的解耦合。

    // 客户端代码
    public class Main {
        public static void main(String[] args) {
            // 创建圆形工厂
            ShapeFactory circleFactory = new CircleFactory();
            // 使用圆形工厂创建圆形对象
            Shape circle = circleFactory.createShape();
            // 绘制圆形
            circle.draw();
    
            // 创建矩形工厂
            ShapeFactory rectangleFactory = new RectangleFactory();
            // 使用矩形工厂创建矩形对象
            Shape rectangle = rectangleFactory.createShape();
            // 绘制矩形
            rectangle.draw();
        }
    }
    

四、工厂方法模式的特点

  1. 符合开闭原则(Open-Closed Principle):工厂方法模式通过将对象的创建委托给子类,在不修改现有代码的情况下引入新的产品类,符合开闭原则。
  2. 隐藏对象创建细节:客户端只需关心产品的接口,无需关心具体产品的创建过程,从而降低了系统的耦合度。
  3. 提供了一种可扩展的方式:通过新增具体工厂类和具体产品类,可以轻松扩展系统功能,满足不同的需求。

五、工厂方法模式的应用场景

工厂方法模式在许多领域都有着广泛的应用,特别适用于以下场景:

  1. 对象的创建需要根据不同的条件进行选择:例如,根据用户的地区选择不同的支付方式。
  2. 系统需要支持多种类型的产品,并且需要动态扩展:例如,一个电商平台需要支持新增的商品类型。

六、小结

工厂方法模式是一种强大的设计模式,它提供了一种灵活的方式来创建对象实例,同时实现了对象的解耦合。通过合理地应用工厂方法模式,我们可以编写出模块化、可维护的代码,提高软件系统的灵活性和可扩展性。在设计软件系统时,我们应该根据具体的需求和场景选择合适的设计模式,从而更好地满足项目的需求。

推荐阅读

  1. Spring 三级缓存
  2. 深入了解 MyBatis 插件:定制化你的持久层框架
  3. Zookeeper 注册中心:单机部署
  4. 【JavaScript】探索 JavaScript 中的解构赋值
  5. 深入理解 JavaScript 中的 Promise、async 和 await
  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值