工厂模式
一、 前言
1.1 为什么学习设计模式
学习编程的人一定会听过设计模式,第一次听到这个词的时候感觉非常高大上,也在网络上搜索阅读过一些设计模式,但都零零散散不够系统,只能片面地了解设计模式,因此决定完整的阅读学习传说中的设计模式,同时开始通过博客来记录巩固每次的学习成果,也方便以后对相关知识点的回顾整理。
1.2 工厂模式简介
工厂模式主要分为以下三类:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
因此本文将分别介绍这三种模式,并说明各个工厂模式的定义、优缺点以及适用场景等。
二、 三种工厂模式
2.1 简单工厂模式
2.1.1 定义
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
2.1.2 类型
由于不属于23种设计模式之一,因此无分类,可视作创建型模式
2.1.3 UML
下图截取自程杰的《大话设计模式》
2.1.4 优点
- 工厂类能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的,封装性较好。
2.1.5 缺点
- 由于工厂类集中了所有实例的创建逻辑,当系统中的具体产品类不断增多时,会出现要求工厂类也要做相应修改的情况,扩展性不好。
2.1.6 适用场景
- 适用于较为简单的不变化的系统中,如果结合反射机制则可以适应与更多的场景中。
2.1.7 小结
简单工厂模式封装了对象的创建过程,对用户而言只需要输入名称或相关参数即可得到对应的产品,但由于在实际生活中,需求的变化总是多种多样的,简单工厂模式并能适应不断变化的需求,因此不太实用此模式。
2.2 工厂方法模式
2.2.1 定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
2.2.2 类型
创建型模式
2.2.3 UML
下图截取自程杰的《大话设计模式》
2.2.4 优点
- 克服了简单工厂违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。
2.2.5 缺点
- 每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。
2.2.6 适用场景
- 对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
- 只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
2.2.7 小结
工厂方法模式相对于简单工厂模式进行了进一步封装与抽象,遵循了开放-封闭原则,能够动态地修改具体工厂类以生产更多种类的产品,已基本满足普通需求,但对于一个产品系列的生成仍需创建多种工厂,较为麻烦,因此对于涉及产品族的生成,应使用接下来的抽象工厂模式。
2.3 抽象工厂模式
2.3.1 定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体的类。
2.3.2 类型
创建型模式
2.3.3 UML
下图截取自程杰的《大话设计模式》
2.3.4 优点
- 易于交换产品系列,当需要更换产品族的时候只需要修改实例化具体工厂的部分,即可对整体的产品进行替换。
- 让具体的创建实例与客户端分离,客户端通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
2.3.5 缺点
- 当增加功能的时候,所有涉及的工厂接口、具体工厂类、产品接口、具体产品类都需要修改,当产品或工厂较多的时候维护成本很高。
2.3.6 适用场景
- 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品,且同属于同一个产品族是在一起使用的情况,如使用Unix与Windows系统时,只会同时使用一种系统。
2.3.7 小结
抽象工厂模式为三种工厂模式中抽象程度最高的模式,其实和工厂方法模式基本可以认为相同,只是在同一工厂中抽象工厂模式具有多个方法分别对应于每个具体的产品,即可以做到一处修改,各处都跟着改变的效果。同时带来的问题在于纵向扩展性不加,但这种修改是无法避免的,所以抽象工厂模式仍是一种非常好的模式。
三、 总结
从简单工厂模式到工厂方法模式再到抽象工厂模式,封装与抽象的程度逐渐提高。在简单工厂模式中,仅仅对产品对象进行了抽象处理,工厂对象只是作为创建工具简单解析客户端的输入来判断该创建何种产品;在工厂方法模式中,不仅对产品抽象,同时也对工厂进行了抽象处理,同一种产品的不同实现分别对应于具体的工厂,而将创建工厂的决定权交给客户端,客户端通过创建不同的工厂来生成对应的产品;在抽象工厂模式中,对于产品一端,考虑到产品不仅仅有实现的不同,同时还有种类的千差万别,而如果每个工厂仅生产一种产品则会造成类的数量激增,同时与现实生活中的产品族概念相对应,将一系列产品的生产权交给同一工厂,使变换产品族更加方便。
在三种工厂模式中,并不存在孰优孰劣,而应该针对具体的实际情况来判断使用何种模式,不然可能画蛇添足,弄巧成拙,带来不必要的麻烦。