No Regrets.

工厂模式及其实例应用

Posted on By Marin



factory pattern

工厂模式的两种情况:   1.在编码时不能预见需要创建哪种类的实例。   2.系统不应依赖于产品类实例如何被创建、组合和表达的细节 使用优势:虽然在增加了代码量,但大大提高了程序的扩展性和维护性。

简单工厂模式

它由三种角色组成:
1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

优点:客户端不再需要创建对象,只需要直接消费对象,对象的创建交给工厂类来进行。
缺点:1、不符合开闭原则,每增加一种对象就需要修改工厂类的商业逻辑。
2、当对象很多的时候一个工厂类的工作量会非常大,而且在对业务类型的理解上也会比较困难。

工厂方法模式

先来看下它的组成吧:
1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

优点:解决了开闭原则问题。能够应付我们可能遇到的大部分业务需求。
缺点:当业务非常多的时候,会产生很多的工厂类,可以通过简单工厂模式+工厂方法模式一起运用的方式进行优化,对于类似的业务统一使用简单工厂模式实现。

抽象工厂模式

抽象工厂模式的组成和工厂方法模式完全一致。
抽象工厂模式特别适合于这样的一种产品结构:产品分为几个系列,在每个系列中,产品的布局都是类似的,在一个系列中某个位置的产品,在另一个系列中一定有一个对应的产品。这样的产品结构是存在的,这几个系列中同一位置的产品可能是互斥的,它们是针对不同客户的解决方案,每个客户都只选择其一。

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

为了解释得更清楚,先介绍两个概念:

产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如 AKitchen 生产的苹果、刀子,苹果属于食物产品等级结构中,而刀子则属于餐具产品等级结构中。而 BKitchen 可能生成另一组产品,如牛奶、杯子。

因此工厂方法模式、抽象工厂模式最大的区别在于:

工厂方法模式:针对的是 一个产品等级结构。

抽象工厂模式:针对 多个产品等级结构。


有Marin的地方就有你的收获