重学设计模式-工厂模式

愿你生命中有够多的云翳,造就一个美好的黄昏 

 

个人感悟

  写了几年的代码后,开始意识到自己写的代码越来越不堪入目,看了以前的代码后,各种冗余,十分臃肿和繁琐,逐渐意识到设计模式的重要性,大学期间教我Java EE的老师一直给我们强调设计模式的重要性,切勿盲目的写代码,但是就是不听,心想,老子不用设计模式,一样能跑起来,现在回想起来,真是年轻,不过在当时那个背景下,做学校的项目或者外面的一些小项目,都是比较传统的项目,根本谈不上并发,扩展,架构等问题,所以根本谈不上用设计模式,后来逐渐接触了一些项目后,思维开始发生变化,特别是在自己开发了一个功能以后,后期需要改的时候,回去看,几百行凌乱的代码摆在眼前,各种循环,各种if else,让人十分的痛苦,不过依然还是要咬牙去看,去改,因为是自己造成的。

  所以,设计模式的重要性我想不用强调过多了!

  

  今天来说一下工厂模式(简单工厂,工厂方法,抽象工厂),工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

 

  一.简单工厂

    我们以创建商品为例,在电商网站中,创建商品是一个重要的模块,商品是多样性的,我们应该可以创建不同类型的商品,我们先看一下如果没有使用工厂模式,我们在代码里面是如何创建商品的;

    

    上图使用if else来判断商品类型,然后进行创建,也可以使用switch case来做判断,但是不难看出,商品少的时候问题倒是不大,但是商品很多的时候,就要写很多判断语句,一方面代码十分不美观,另一方面则很难维护,如果某个商品发生了变更,那么就要来判断条件里面改,显然不合理,下面我们使用简单工厂来对代码进行改造。

  1.创建一个商品接口。

    

  2.创建商品实现类CommodittyA和CommodittyB,用来对商品A和B做具体实现

  

  

  3.创建商品工厂,用于获取商品实例。

  

  上面是获取商品实例的工厂,只需要传入相应的商品枚举,就能够返回对应的商品实例,但是我们发现一个问题,如果使用if else来判断商品类型,没增加一个商品,就需要加一个判断条件,显然不符合开闭原则,那怎么办呢,很简单,我们可以使用反射机制来完成这个工作,继续对代码进行改造。

  

  使用反射机制后,可以在运行时动态的获取某个类,这就比较灵活了,我们客户端只需要传入类就行。

  

   使用简单工厂我们可以让我们很方便的创建我们的产品,但是我们不难看出,一个工厂负责所有产品的生产,如果产品少其实还行,但是如果商品特别多,那么整个工厂就会变得十分庞大,臃肿,我们应该在工厂这个维度进行细分,一个工厂过于搭,我们分为两个,A商品专门让A工厂生产,B商品由B工厂生产,让它们各司其职,分工明确。

  由此我们引入了工厂方法;

 

  二.工厂方法

  工厂方法分工明确,不再让所有工作都放在同一个工厂里面做,而是每一个商品对应一个工厂,这样划分后,工厂就不会变得臃肿,当需要增加商品时,增加对应的工厂就行。

  1.首先创建一个抽象工厂类,任何工厂都必须继承它,

  

   2.创建具体实现工厂类,继承抽象工厂,用于实现具体商品

  

   3.抽象产品类,它定义了生产产品的方法,具体实现产品的类必须继承它

  

   4.客户端调用

  

  由上面步骤我们可知,我们定义了一个抽象工厂类,一个抽象产品类,然后具体的工厂继承抽象工厂,具体产品继承抽象产品类,当新增一个商品时,增加相应的具体工厂类和具体产品类就行了,而不用去代码里面新增,符合开闭原则。

  关系图如下

  

   至此工厂方法模式就完了,我们可以得知工厂方法模式的可以使分工更加的明确,耦合性很小,容易扩展,当我们在系统中需要new一个复杂的对象时,我们可以选择工厂方法模式。

 

   抽象工厂模式随后更新