简单工厂模式、工厂方法模式、抽象工厂模式的异同

工厂就是用来创造东西。编程

简单工厂模式:

定义:

提供了一个建立对象实例的功能,而不关心具体的实现细节。spa

优势:

  1. 封装:实现了组件的封装,可让组建的外部能够面向接口编程
  2. 解耦:客户端无须知道实现类,实现了客户端与具体实现的解耦

缺点:

  1. 增长复杂度:若经过传参来选择具体的实现类,就会暴露实现细节,而且增长客户端的使用难度,须要了解每一个参数的意义。(能够经过可配置方法来解决这个问题)

静态工厂模式:

不须要建立工厂实例,方法为静态设计

 

工厂方法模式:

结构图:

定义:

定义一个建立对象的接口,让子类决定实例化哪个类,工厂方法使一个对象的实例化延迟到子类。对象

功能:

在父类不知道具体实现的状况下,完成自身的功能调用,具体的实现由子类完成。设计的时候不须要考虑具体的实现,须要哪一个对象在,经过工厂方法返回就能够。blog

实现:接口

工厂方法的实现,通常是定义一个抽象类,包含建立对象所需的抽象方法则为工厂方法。也能够实现为具体的类,这样就会有一个默认的方法,子类去覆盖这个方法,为子类提供挂钩。产品

在工厂方法模式里,要么使用Creator对象,要么使用Creator建立出来的对象, 一版客户端不会直接使用工厂方法。扩展

优势:

  1. 工厂方法模式能够在不知具体状况的时候编程,须要某个产品对象,只须要知道接口,不须要知道具体的实现,具体的实现让子类完成。
  2. 更容易扩展对象的新版本,工厂方法给子类提供一个挂钩。

缺点:

  1. 具体的工厂方法和产品对象是耦合的

抽象工厂模式:

定义:

提供一个建立一系列相关或相互依赖的接口,而无需指定他们具体须要实现的类配置

功能:

为一系列相关对象或相互依赖的对象,建立一个接口。方法

优势:

  1. 分离接口与实现,客户端使用抽象工厂建立对象,而不须要知道具体的实现是谁。
  2. 是的切换产品簇变的容易,客户端切换不一样的工厂实现,就是切换了不一样的产品簇。

缺点:

  1. 不容易扩展新的产品,要是扩展就要修改抽象工厂,对应全部的实现类都要修改
  2. 容易形成类层次复杂

总结:

简单工厂与工厂方法的区别

工厂方法的本质是用来选择实现的,跟简单工厂的区别在于工厂方法的实现是延迟到子类的。若是把工厂方法的实现放到父类直接实现就至关于简单工厂。

简单工厂与抽象工厂的区别

简单工厂用来选择实现,能够选择任意接口的实现,一个工厂能够用于选择和建立多个个对象,可是这多个对象之间是没有联系的。

抽象工厂是用来选择产品簇的实现,抽象工厂有多个方法来选择并建立对象,这些对象之间一般是有关系的。若是抽象工厂只有一个实现,不分层次,则至关于简单工厂。

抽象工厂和工厂方法模式的区别

这两个模式既有区别也有联系,能够组合使用。工厂方法模式是针对单独的产品的建立,而抽象工厂针对产品簇的建立,抽象工厂能够退化成工厂方法,工厂方法能够退化成简单工厂。

在抽象工厂的实现中,可使用简单工厂来提供抽象工厂的具体实现,能够这么组合使用。

相关文章
相关标签/搜索