设计模式——工厂方法与抽象工厂方法

在说设计模式的工厂方法模式之前时,先了解了一下简单工厂。

简单工厂

简单工厂属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

实质: 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
在这里插入图片描述


工厂方法模式

工厂方法主要用于封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入实现解耦与复用,并方便后期维护拓展。核心结构有4个角色,分别是抽象工厂,具体工厂,抽象产品,具体产品。

简介

工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

与简单工厂的关系

工厂方法是简单工厂的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开闭原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

工厂类与产品类的关系

在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

模式结构

  • 抽象工厂(Creator)角色

工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

  • 具体工厂(Concrete Creator)角色

这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

  • 抽象产品(Product)角色

工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

  • 具体产品(Concrete Product)角色

这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

工厂模式的UML图

在这里插入图片描述

缺点
  • 类的个数随具体工厂与产品成对增加,一定程度上增加了系统的复杂度。
  • 更换另外一种产品,需要修改实例化的具体工厂类。
  • 一个具体工厂只能创建一种具体产品。
总结

工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。


抽象工厂模式

在了解抽象模式之前,先了解下产品簇。

指位于不同产品等级结构中,功能相关联的产品组成的家族。一般是位于不同的等级结构中的相同位置上。显然,每一个产品族中含有产品的数目,与产品等级结构的数目是相等的,形成一个二维的坐标系,水平坐标是产品等级结构,纵坐标是产品族,叫做相图。产品族难扩展,产品等级易扩展。

产品簇可以理解不同产品,例如,手机与电脑就是两个产品簇。
产品等级可以理解为产品品牌,例如,手机中的苹果,OPPO等。


抽象工厂模式的描述

抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

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

简介

当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品 角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。

抽象工厂模式的UML图

在这里插入图片描述
惠普与华硕生成工厂继承Pc工厂,创建相应的鼠标键盘,使之继承鼠标键盘基类,进而,惠普与华硕工厂就可以生成自己品牌的鼠标键盘。

在抽象工厂模式中,假设我们需要增加一个工厂

在这里插入图片描述
其对应的工作流程和原始的工作流程一致,即新增华硕工厂继承Pc工厂,然后创建华硕鼠标,华硕键盘,并使其继承鼠标键盘即可

在抽象工厂模式中,假设我们需要增加一个产品

在这里插入图片描述
增加耳麦这个产品所需要的流程。先增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。

从上图理解,产品族难扩展,产品等级(产品类别)易扩展。


经过以上的分析,总结其优缺点如下。

优点

  • 具体产品从客户代码中被分离出来
  • 容易改变产品的系列
  • 将一个系列的产品族统一到一起创建

缺点

在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口


简单工厂,工厂方法与抽象工厂模式的简单实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值