一、前言
在学习了设计模式的基本概念和设计模式的基本原则后,今天我们正式开始进行设计模式的实战:工厂模式。在本文中会针对工厂模式的概念、解决问题、如何解决、使用场景、代码示例、注意事项等多角度来进行剖析。
二、关于工厂模式
2.1、概念
工厂模式属于创建型模式,是常用的设计模式之一,他提供了一种创建对象的最佳方式。使用工厂模式我们可以在创建对象时是通过一个公共的接口来指向新创建的对象,不会对外暴露创建的业务逻辑。你只管调用就完了,不用理会对象的实例是如何创建的。
2.2、解决问题
工厂模式主要解决接口创建时的选择问题(业务解耦),也就是说我们已经很明确的计划在不同的条件下创建不同的实例了。简单来说就是提供了代码结构的可拓展性,屏蔽了每一个功能的具体业务实现。外部可以更简单的调用即可。同时也是去掉多个if else的一个解决方案。
2.3、如何实现
定义一个创建对象的接口,让其子类决定实例化对象的类型。
① 创建接口
② 实现接口(多实现)
③ 定义工厂类
④ 根据业务情况决定实例化对象类型
2.4、使用场景
消息的发送:向不同平台(可能是H5端、手机app端、微信公众号、小程序等)发送业务消息,且他们对消息模板的数据要求是不一致的。
2.5、优缺点
优点:
① 调用者想创建爱你一个对象时,只需要知道名称就可以了
② 拓展性高,做到了对责任的分割和业务解耦,如果想新增一个产品,只需拓展工厂类即可
③ 屏蔽产品的具体实现,调用者只需关心产品的接口
④ 易于后期线上问题定位和整改
缺点:
① 每增加一个产品都要创建一个具体类和工厂业务分支,一定程度上增加了负责度
② 增加了系统系统间的依赖,比如:工厂挂了整个就没了
2.6、注意事项
作为一种创建类模式,在任何需要生成负责对象的地方都可以使用工厂模式。但是需要注意的是一些简单的对象和业务逻辑简单,变更不大以及只需要通过new就可以创建的对象,无需使用工厂模式。毕竟工厂模式的使用需要引入一个工厂类这其实是增加了系统复杂度的。
三、代码实现示例
整个设计模式这部分的代码我都会放到git上面,诸君可以随意进行下载查看,地址如下:
设计模式项目源码
3.1、定义一个api接口
public interface SendMsgService {
/**
* 功能描述: 发送消息
* Param: [msg]
* Return: void
*/
void sendMsg(String msg);
}
Java
3.2、客户端发送消息实现类
/**
* @author XA
* date 2021/5/27 10:16
* description: 发送客户端消息业务实现类
*/
public class SendMsgForClientServiceImpl implements SendMsgService {
/**
* 功能描述: 发送客户端消息
* Param: [msg]
* Return: void
*/
@Override
public void sendMsg(String msg) {
System.out.println("发送客户端消息:" + msg);
}
}
Java
3.3、移动端消息发送业务实现类
/**
* @author XA
* date 2021/5/27 10:14
* description: 发送手机端消息
*/
public class SendMsgForMobileServiceImpl implements SendMsgService {
/**
* 功能描述: 发送手机端消息
* Param: [msg]
* Return: void
*/
@Override
public void sendMsg(String msg) {
System.out.println("发送手机端消息:" + msg);
}
}
Java
3.4、消息发送工厂类
/**
* @author XA
* date 2021/5/27 10:17
* description: 消息发送工厂类
*/
public class SendMsgFactory {
/**
* 功能描述: 消息发送工厂处理类
* Param: [msgType]
* Return: service.SendMsgService
*/
public SendMsgService sendMsgFactory(Integer msgType){
// 0:手机端消息;1:客户端消息(也可以使用枚举类)
if(msgType.equals(0)){
return new SendMsgForMobileServiceImpl();
}else if(msgType.equals(1)){
return new SendMsgForMobileServiceImpl();
}else{
return null;
}
}
}
Java
3.5、测试
public class XaTest {
@Test
public void xaTest(){
SendMsgFactory sendMsgFactory = new SendMsgFactory();
/* 模拟手机消息发送 */
SendMsgService sendMsgServiceForMobile = sendMsgFactory.sendMsgFactory(0);
sendMsgServiceForMobile.sendMsg("这是一个手机消息...");
/* 模拟客户端消息发送 */
SendMsgService sendMsgServiceFoeClient = sendMsgFactory.sendMsgFactory(1);
sendMsgServiceFoeClient.sendMsg("这是一个客户端消息...");
}
}
输出如下:
发送手机端消息:这是一个手机消息...
发送手机端消息:这是一个客户端消息...