Java 后端开发必看!工厂设计模式轻松拿捏

createh51周前 (05-15)技术教程3

你在 Java 后端开发中有没有遇到过这样的问题?当项目规模逐渐扩大,代码中对象的创建逻辑变得越来越复杂混乱,每次新增一个功能模块,都要在多处重复编写对象创建代码,不仅效率低下,后期维护也困难重重。相信不少在互联网大厂做后端开发的小伙伴都被这些问题困扰过,别着急,Java 中的工厂设计模式就能很好地解决这些难题!

在互联网大厂的 Java 后端开发项目中,随着业务需求的不断迭代,代码的复杂度也在持续攀升。以电商系统为例,从商品展示、购物车管理到订单处理,每个功能模块都涉及到大量对象的创建和管理。如果没有一种合理的设计模式来规范对象的创建过程,很容易出现代码耦合度过高的情况。一旦某个对象的创建逻辑发生变化,就可能影响到多个相关模块,导致牵一发而动全身。工厂设计模式应运而生,它将对象的创建和使用进行分离,使得代码结构更加清晰,可维护性和可扩展性大大增强。

工厂设计模式的核心概念与优势

工厂设计模式作为创建型设计模式的重要一员,核心思想在于将对象的创建逻辑封装在工厂类中,客户端只需向工厂请求对象,而无需关心对象的具体创建过程。这种模式具有诸多显著优势:

  • 解耦对象创建与使用:降低代码之间的耦合度,使代码结构更加清晰。例如在一个大型游戏开发项目中,角色的创建逻辑复杂且多样,通过工厂模式将角色创建封装,游戏其他模块调用时无需了解创建细节。
  • 提高代码可维护性:当对象创建逻辑发生变化时,只需修改工厂类,而不影响客户端代码。就像电商系统中支付方式的新增或修改,在工厂类中处理即可。
  • 便于代码复用:工厂类可以被多个地方复用,减少重复代码的编写。如在多个项目中都需要创建数据库连接对象,就可以通过一个数据库连接工厂类来实现。

Java 中工厂设计模式的实现方式

简单工厂模式

简单工厂模式是工厂模式的基础,虽然它不属于 GOF23 设计模式,但在实际开发中也有广泛应用。它定义一个工厂类创建产品对象,根据传入的参数决定创建哪种具体产品。

我们以支付系统为例,首先定义一个产品接口Payment:

public interface Payment {
    void pay();
}

然后创建具体的产品类,如AliPay和WeChatPay:

public class AliPay implements Payment {
    @Override
    public void pay() {
        System.out.println("使用支付宝支付");
    }
}

public class WeChatPay implements Payment {
    @Override
    public void pay() {
        System.out.println("使用微信支付");
    }
}

接着创建工厂类PaymentFactory:

public class PaymentFactory {
    public static Payment createPayment(String type) {
        if ("alipay".equals(type)) {
            return new AliPay();
        } else if ("wechatpay".equals(type)) {
            return new WeChatPay();
        }
        return null;
    }
}

在客户端调用时

public class Main {
    public static void main(String[] args) {
        Payment payment = PaymentFactory.createPayment("alipay");
        if (payment != null) {
            payment.pay();
        }
    }
}

不过简单工厂模式也有缺点,当新增产品时,需要修改工厂类的代码,违反了开闭原则,在产品种类较多时不太适用。

工厂方法模式

工厂方法模式是对简单工厂模式的进一步优化,它将创建对象的方法抽象成抽象方法,由具体的子类去实现。这样在新增产品时,不需要修改工厂类,只需要新增一个具体的工厂子类即可。

还是以支付系统为例,先定义抽象工厂类PaymentFactory:

public abstract class PaymentFactory {
    public abstract Payment createPayment();
}

然后创建具体的工厂子类AliPayFactory和WeChatPayFactory:

public class AliPayFactory extends PaymentFactory {
    @Override
    public Payment createPayment() {
        return new AliPay();
    }
}

public class WeChatPayFactory extends PaymentFactory {
    @Override
    public Payment createPayment() {
        return new WeChatPay();
    }
}

客户端调用时:

public class Main {
    public static void main(String[] args) {
        PaymentFactory aliPayFactory = new AliPayFactory();
        Payment aliPay = aliPayFactory.createPayment();
        aliPay.pay();

        PaymentFactory weChatPayFactory = new WeChatPayFactory();
        Payment weChatPay = weChatPayFactory.createPayment();
        weChatPay.pay();
    }
}

工厂方法模式使得系统的扩展性更强,符合开闭原则,但它会导致工厂子类过多,增加系统的复杂性。

抽象工厂模式

抽象工厂模式用于创建一系列相关的对象,它提供一个创建一系列相关产品对象的接口,而无需指定它们具体的类。这种模式适用于创建对象之间存在依赖关系,且需要统一管理创建过程的场景。

假设我们的支付系统不仅有支付功能,还涉及到订单生成和物流通知,我们可以定义抽象产品接口Payment、Order和Logistics:

public interface Payment {
    void pay();
}

public interface Order {
    void generateOrder();
}

public interface Logistics {
    void notifyLogistics();
}

创建具体产品类,如AliPay、AliOrder和AliLogistics,以及WeChatPay、WeChatOrder和WeChatLogistics:

public class AliPay implements Payment {
    @Override
    public void pay() {
        System.out.println("使用支付宝支付");
    }
}

public class AliOrder implements Order {
    @Override
    public void generateOrder() {
        System.out.println("生成支付宝订单");
    }
}

public class AliLogistics implements Logistics {
    @Override
    public void notifyLogistics() {
        System.out.println("通知支付宝物流");
    }
}

public class WeChatPay implements Payment {
    @Override
    public void pay() {
        System.out.println("使用微信支付");
    }
}

public class WeChatOrder implements Order {
    @Override
    public void generateOrder() {
        System.out.println("生成微信订单");
    }
}

public class WeChatLogistics implements Logistics {
    @Override
    public void notifyLogistics() {
        System.out.println("通知微信物流");
    }
}

再定义抽象工厂接口PaymentSystemFactory:

public interface PaymentSystemFactory {
    Payment createPayment();
    Order createOrder();
    Logistics createLogistics();
}

创建具体的工厂类AliPaymentSystemFactory和
WeChatPaymentSystemFactory:

public class AliPaymentSystemFactory implements PaymentSystemFactory {
    @Override
    public Payment createPayment() {
        return new AliPay();
    }

    @Override
    public Order createOrder() {
        return new AliOrder();
    }

    @Override
    public Logistics createLogistics() {
        return new AliLogistics();
    }
}
public class WeChatPaymentSystemFactory implements PaymentSystemFactory {
    @Override
    public Payment createPayment() {
        return new WeChatPay();
    }

    @Override
    public Order createOrder() {
        return new WeChatOrder();
    }

    @Override
    public Logistics createLogistics() {
        return new WeChatLogistics();
    }
}

客户端调用:

public class Main {
    public static void main(String[] args) {
        PaymentSystemFactory aliFactory = new AliPaymentSystemFactory();
        Payment aliPay = aliFactory.createPayment();
        Order aliOrder = aliFactory.createOrder();
        Logistics aliLogistics = aliFactory.createLogistics();

        aliPay.pay();
        aliOrder.generateOrder();
        aliLogistics.notifyLogistics();

        PaymentSystemFactory weChatFactory = new WeChatPaymentSystemFactory();
        Payment weChatPay = weChatFactory.createPayment();
        Order weChatOrder = weChatFactory.createOrder();
        Logistics weChatLogistics = weChatFactory.createLogistics();

        weChatPay.pay();
        weChatOrder.generateOrder();
        weChatLogistics.notifyLogistics();
    }
}

抽象工厂模式虽然功能强大,但它的实现较为复杂,当产品族发生变化时,修改成本较高。

工厂设计模式在互联网大厂项目中的实际应用场景

微服务架构中的服务实例创建

在微服务架构下,一个大型系统被拆分成多个独立的微服务。每个微服务可能都需要创建不同类型的服务实例,如用户服务需要创建用户注册服务实例、用户登录服务实例等。通过工厂设计模式,可以将这些服务实例的创建逻辑封装在工厂类中,方便管理和维护。同时,当需要对服务实例的创建逻辑进行修改或新增服务实例时,也能快速实现,而不影响其他微服务。

数据访问层的数据库连接创建

在互联网大厂的项目中,数据库的使用非常频繁。不同的业务模块可能需要连接不同类型的数据库,如 MySQL、Oracle、MongoDB 等。使用工厂设计模式创建数据库连接工厂类,根据配置信息创建不同类型的数据库连接对象。这样可以统一管理数据库连接的创建过程,提高代码的可维护性和可复用性。而且在切换数据库类型时,只需要修改工厂类的逻辑,而不需要在每个使用数据库连接的地方进行修改。

总结

掌握 Java 工厂设计模式,对于我们在互联网大厂的后端开发工作至关重要。它不仅能让我们的代码更加规范、高效,还能在项目不断迭代的过程中,大大降低维护成本。从简单工厂模式到工厂方法模式,再到抽象工厂模式,每种模式都有其适用场景和优缺点。各位小伙伴们,赶紧动手实践起来,把工厂设计模式运用到自己的项目中吧!在实际应用过程中,要根据项目的具体需求和规模,选择合适的工厂模式。如果你在实践过程中有任何问题,或者有更好的使用经验,欢迎在评论区分享交流,大家一起进步!

相关文章

Java编程程序员怎么提升开发水平?

java开发技术在不断的更新,小伙伴想要在java开发行业内容稳步的发展,是需要不断的学习来提升自身开发技术水平。无论小伙伴是通过自学还是java培训班学习的,在入职之后都是需要不断的学习新的开发技术...