【一天一个设计模式】——工厂模式(Factory Pattern)

本文介绍了工厂设计模式,这是一种常用的创建型设计模式,用于降低代码耦合度并提高可重用性。通过创建一个LogisticsService接口和多个实现类(如航空、陆上、海上物流),实现了物流系统的不同服务。利用工厂类logisticsFactory根据参数创建相应物流对象,实现了业务逻辑的隔离,便于维护和扩展。工厂模式遵循单一职责原则,增强了代码的测试和修改能力。
摘要由CSDN通过智能技术生成

为了提升自身编写代码的风格规约,打算学一学恼人的设计模式,今天从工厂设计模式开始~

工厂模式属于创建型设计模式,也是比较常用的设计模式之一,从字面意思,我们就可以知道它是用来创建对象的一个工厂,那么我们何时去选择使用这一设计模式呢?
在这里插入图片描述

设计思想
我们通过创建一个接口,让其实现类根据相应的条件有选择的创建对象,而不对外暴露出具体创建过程,外部只知道调用了接口,而不知道对象是如何创建的。

例子
从上面我们可以知道,这样的结构使代码之间的耦合度降低,提高了代码的可重用性,方便测试、修改和扩展,举个例子:

在一个电商项目,物流系统包括了航空物流、陆上物流和海上物流,在不同情况下需要根据需要调用不同的物流方式
在这里插入图片描述
项目结构为



——src
 ——main
  ——java
   ——com.xxx.demo.logis
    ——service
     ——impl
      ——AviationLogisticsServiceImpl
      ——MarineLogisticsServiceImpl
      ——OnshoreLogisticsServiceImpl
     ——LogisticsService
    ——logisticsFactory
 ——test
  ——java
   ... ...

首先创建一个接口LogisticsService,要想创建3种物流方式,都需要通过这个接口来处理。

public interface LogisticsService {
   void getLogistic(各种参数);
}

接下来创建实现接口的实体类AviationLogisticsServiceImpl、MarineLogisticsServiceImpl、OnshoreLogisticsServiceImpl。这些类中需要实现具体的业务,你可以看到,每个实现类互不干扰,这对未来业务的维护很友善,若将来想添加新的物流方式,例如“无人机物流”,那么只需要按照相似的结构编写业务逻辑即可。

public class AviationLogisticsServiceImpl implements LogisticsService {
 
   @Override
   public void getLogistic(各种参数) {
      具体业务逻辑...
   }
}
public class OnshoreLogisticsServiceImpl implements LogisticsService {
 
   @Override
   public void getLogistic(各种参数) {
      具体业务逻辑...
   }
}
public class MarineLogisticsServiceImpl implements LogisticsService {
 
   @Override
   public void getLogistic(各种参数) {
      具体业务逻辑...
   }
}

最后创建一个工厂Factory,生成基于给定信息的实体类对象。这里的给定信息,我们假设当传入的参数Lcode为10301时,生成航空物流;参数为10302时,生成海上物流,参数为10303时,生成陆上物流。

public class logisticsFactory {
    
   //使用 getLogis 方法获取物流类型的对象
   public LogisticsService getLogis(String Lcode){
      if(Lcode == null){
         return null;
      }        
      if(Lcode.equals("10301")) return new AviationLogisticsServiceImpl();
      if(Lcode.equals("10302")) return new MarineLogisticsServiceImpl();
	  if(Lcode.equals("10303")) return new OnshoreLogisticsServiceImpl();
      throw new RuntimeException("此物流方式不存在")
   }
}

在工厂中,你可以根据相应的条件来创建对象,若以后增加了新的物流,可以到这里进行修改。

总结:

在工厂模式中,每个实体类都只关心自己的业务逻辑,都只有一个功能,这满足了单一职责原则,同时调用者在创建对象时无需了解具体创建流程,避免了与业务逻辑发生碰撞,最后,工厂模式的扩展性好,但不宜加入过多的“产品”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Uranus^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值