设计模式系列之为什么要使用工厂模式

这是我参与更文挑战的第25天,活动详情查看: 更文挑战

背景

昨天别人问了我一个问题,为什么要使用工厂模式呢?看很多网上资料的介绍,感觉都是多此一举,没有必要专门再加个工厂类去创建对象,直接new不是更方便吗?今天就按照自己的理解把这个问题回答一下.

为什么要使用工厂模式

与一个对象相关的职责有三块:

  • 对象本身所具有的职责: 对象本身所提供的功能,也就是对象类提供的业务功能
  • 创建对象的职责: 负责创建对象
  • 使用对象的职责: 负责使用对象

在平时简单使用中,创建对象一般用new(),然后和使用对象是放在一起的,比如:

String str = new String("test");
str.func();
复制代码

像String()这种简单的类这么使用是没问题的,创建和使用可以放在一个地方,但是对于一些复杂的业务类,创建对象的代码会很复杂(可以设想它要做非常多的操作),那么从代码维护和代码复用角度看,如果还是把创建和使用对象的逻辑放在一起,那么代码就会变的越来越难以维护

所以此时就用到了工厂模式,它的核心点就是把创建对象的逻辑独立出来,放到工厂中去完成,这样对象的三部分职责就完全隔离开来,可以独立维护

工厂模式的引入将降低因为产品或工厂类改变所造成的维护工作量:

  • 如果创建对象的逻辑变了,比如构造函数变了,那么只需改动工厂中的代码,而不用改动使用对象的地方
  • 如果对象对外提供的接口方法变了,比如添加或移除了接口,那么只需改动使用对象的地方,而不用改动工厂方法

工厂模式可以降低代码重复。如果创建对象B的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。我们可以这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的创建过程的修改维护。

很多资料中的代码都只是简单的演示了如何写工厂模式,但是并没写出关键点,在工厂类中也只是简单了new()生成对象之后返回出去,所以从表面上看起来,这个工厂模式完全没有必要,还不如直接把创建对象的new()和使用对象的地方放在一起方便

所以要理解工厂模式的必要性,就可以把情况往复杂了想:

  • 创建对象的逻辑非常复杂,而且经常变动,如果不使用工厂模式,那么每个使用对象的地方都要写一遍,而且一旦创建逻辑改动,那么所有的地方也都要跟着改动
  • 而在使用了工厂模式之后,就可以把这段复杂的创建对象的逻辑放在工厂方法中

在所有的工厂模式中,都强调一点:两个类A和B之间的关系应该仅仅是A创建B或是A使用B,而不能两种关系都有。将对象的创建和使用分离,也使得系统更加符合“单一职责原则”,有利于对功能的复用和系统的维护。

使用工厂类的另外一个优点是,如果不使用工厂模式,一个类可能拥有多个构造函数,客户端只能通过传入不同的参数来调用不同的构造函数创建对象,从构造函数和参数列表中也许使用者根本不了解不同构造函数所构造的产品的差异。但如果将对象的创建过程封装在工厂类中,我们可以提供一系列名字完全不同的工厂方法,每一个工厂方法对应一个构造函数,客户端可以以一种更加可读、易懂的方式来创建对象,而且,从一组工厂方法中选择一个意义明确的工厂方法,比从一组名称相同参数不同的构造函数中选择一个构造函数要方便很多。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享