什么是工厂模式

工厂模式就是将创建对象的具体过程和使用过程分开,这样能够使代码更加灵活。

工厂模式主要分为三类:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

比如在没有工厂的时候,用户需要一台奥迪车,那么就需要用户去创建一台奥迪车,然后使用

简单工厂模式:如果我需要一辆奥迪,我不需要自己去创建奥迪,想要奥迪哪个牌子直接通过工厂创建就行了,比如我需要奥迪A4L,那工厂就去创建奥迪A4L。

工厂方法模式:为了照顾不同的客户,奥迪车型越来越多,比如A4L、A6L、A8L等等,一个工厂无法创建所有的奥迪车型,于是单独出来多个具体的奥迪工厂,每个工厂创建一款车型,也就是具体的工厂类只能创建一个具体的产品。但是奥迪工厂还是个抽象,你需要指定某个具体的工厂才能生产出具体的奥迪车型。

抽象工厂模式:随着奥迪客户的要求越来越高,奥迪车必须配置LED显示屏,于是工厂开始生产奥迪车所需要的LED显示屏,然后在卖车的时候客户只要对销售顾问说:我要购买奥迪A4L 带有LED显示屏的这款车,限售顾问就给客户提供A4L LED显示屏的车,而不用自己去创建A4L显示屏的车

工厂模式优缺点

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

2、工厂模式可以减少错误,因为工厂管理了对象的创建逻辑,使用者不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。

简单工厂案例演示

如果不使用工厂模式,那我们需要奥迪A4L和A6L的话就需要自己创建对象如下:

Java设计模式之工厂模式_工厂模式

如果使用简单工厂的话那创建对象的过程就交给了工厂来创建,简单工厂包含下面角色:

  • 工厂类角色:工厂模式的核心部分,用来创建产品,包含一些逻辑判断。
  • 抽象产品角色:具体的产品继承的父类或者实现的接口
  • 具体产品角色:工厂类角色创建的对象就是具体产品的实例,即具体类实现

代码实现:

抽象产品&&具体产品类代码:

Java设计模式之工厂模式_抽象工厂_02

 工厂类代码:

Java设计模式之工厂模式_设计模式_03

 这个时候客户就可以通过工厂创建奥迪汽车了

Java设计模式之工厂模式_设计模式_04

 简单工厂优缺点:优点就是对象创建和使用的职责分离;缺点就是不符合开闭原则,每次添加新产品需要修改工厂类,产品类较多的时候不利于工厂类的维护。

工厂方法模式案例演示

         工厂方法就是定义一个创建对象的接口,接口中定义创建对象的方法,不同的工厂类实现这个接口并重写该方法。也就是每新增一个产品只需要增加该产品对应的具体的工厂实现类。优点就是符合了开闭原则,缺点就是每增加一个产品都需要增加一个具体产品类和实现工厂类,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度。工厂方法模式包含的角色如下:

  • 抽象工厂角色:工厂方法模式的核心部分,是具体工厂角色必须实现的接口或者必须继承的父类,在 Java 中它由抽象类或者接口来实现。 
  • 具体工厂角色:创建产品的具体工厂实现类
  • 抽象产品角色:具体的产品继承的父类或者实现的接口
  • 具体产品角色:工厂类角色创建的对象就是具体产品的实例,即具体类实现

代码实现:

奥迪产品类代码:

Java设计模式之工厂模式_工厂模式_05

 工厂类代码:

Java设计模式之工厂模式_工厂模式_06

客户调用代码:

Java设计模式之工厂模式_工厂类_07

 抽象工厂案例演示

        抽象工厂模式主要用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用同一个产品族中的对象;并且通过隔离具体类的生成,使得客户端不需要明确指定具体生成类;所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。角色包括:

  • 抽象工厂角色:工厂方法模式的核心部分,是具体工厂角色必须实现的接口或者必须继承的父类,在 Java 中它由抽象类或者接口来实现。 
  • 具体工厂角色:创建产品的具体工厂实现类
  • 抽象产品角色:具体的产品继承的父类或者实现的接口
  • 具体产品角色:工厂类角色创建的对象就是具体产品的实例,即具体类实现

        通过抽象工厂我们可以实现下面效果,比如奥迪A4L使用型号A的LED显示屏和A型号的发动机,而奥迪A6L使用B型号的LED显示屏和B型号的发动机,在为A4L和A6L生产相关配件时无需定制配件型号,可以自动根据车型匹配对应的型号配件。

发动机型号代码:

Java设计模式之工厂模式_工厂模式_08

 LED显示屏型号代码:

Java设计模式之工厂模式_工厂类_09

 工厂类代码如下:

Java设计模式之工厂模式_抽象工厂_10

 客户调用代码:

Java设计模式之工厂模式_工厂类_11

工厂方法模式与抽象工厂模式的区别在于:

1、工厂方法只有一个抽象产品类和一个抽象工厂类,但可以派生出多个具体产品类和具体工厂类,每个具体工厂类只能创建一个具体产品类的实例。

2、抽象工厂模式拥有多个抽象产品类(产品族)和一个抽象工厂类,每个抽象产品类可以派生出多个具体产品类;抽象工厂类也可以派生出多个具体工厂类,同时每个具体工厂类可以创建多个具体产品类的实例