23种设计模式-抽象工厂模式

1.产生背景

  • 为什么需要抽象工厂模式

工厂相关设计模式的发展由简到繁,基本是通过不断的改良前一个模式的缺点衍生而来;

上一节我们讲述了“工厂方法模式”,它改良了“简单工厂模式”不可扩展的缺点(基本上是推翻了),实现了工厂的可扩展性;当然,也带来了使用的复杂性;不过,可以通过IOC或者增加工厂的工厂,如:工厂对象本身的创建,可以通过简单工厂来实现,而业务对象则使用工厂方法模式来实现,从而做兼顾“方便性”和“可扩展”;

解释: 工厂实例又用工厂来创建,会不会陷入一个鸡生蛋,蛋生鸡的矛盾之中;其实简单工厂重在简单,用于创建逻辑相对简单的对象(比如:只需要简单的逻辑判断就可以创建),而工厂方法用于创建那些需要复杂逻辑的业务对象(比如:需要创建、初始化、复杂依赖注入);其重在扩展;

所以,在核心业务对象的创建,我们可以使用工厂方法模式,而在使用工厂方法的过程中,可以通过IOC,或者牺牲部分扩展性,兼顾方便性,通过简单工厂创建工厂,再通过工厂方法模式创建业务对象;本质上:是一种无奈和妥协;

工厂方法模式,实现了对象创建的高度扩展性,那么它是否就是一个完美的解决方案呢?

其实,它只是侧重解决了扩展性,但是,它与“简单工厂”一样,虽然可以创建一个抽象不同实现的一系列对象,但是从抽象层来看,它仍然只能创建一个抽象的对象;
这里写图片描述

现在来看看工厂方法有哪些缺陷:
从上图要以看出,工厂方法可以创建:衬衫、大衣两个实现类的对象,但是,实际上他们都属于上衣;现实中,如果一个人穿衣服,必然是上衣、裤子、鞋子、甚至其它一些搭配装饰一起穿才算正常;

但是,目前工厂方法无法创建一批,具有同等地位,而且在某些方面具有一定相关性的业务对象

2.概念

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

重点: 一组、相关

3.目的

解决工厂方法无法创建一组相关对象的缺点

4.解决方案

本质:把工厂方法中只有一个创建方法,扩展到一组方法;每个方法创建一个抽象的一系列对象,这一组方法创建的对象,在业务层,具有相关性;

  • 工厂增加多个创建方法

工厂方法模式最大的缺点,就是只能创建一个抽象(接口、抽象类)的一系列对象,如果一个工厂再增加一些方法,分别创建不同的抽象的一系列对象,就可以让一个工生同时创建一组相关对象;
这里写图片描述

通过上图,可以看到,抽象工厂,增加了更多的创建方法;这一组方法创建的对象在业务上是具有相关性;

工厂方法,已经把每种类型对象的创建细粒度化,需要什么的对象,只要创建对应的工厂就可以,为什么还需要抽象工厂,把对象的创建分为一组?

主要目的:使用的便捷性;

假如,现实中,客人需要买一套爱马仕的衣服,按工厂方法模式,需要分别通知上衣工厂、裤子工厂、鞋子工厂分别制作;如果一个店里出售的品牌非常多,就需要记忆太多的工厂,使用非常不方便;

但是,如果每个品牌只有一个工厂,需要什么品牌的衣服,只需要通知这个工厂,就要以制作这个品牌的一套衣服;

5. 类图

不完整类图
这里写图片描述

6.优缺点

优点:

  • 具有工厂方法的可扩展性
  • 具有创建一组相关对象的能力

缺点:

  • 具体工厂本身的选择,仍然需要客户进行处理

最核心的目的:创建一组相关抽象实例的能力;

7.现实场景

猜你喜欢

转载自blog.csdn.net/yangspgao/article/details/80546324