C++设计模式之Factory(工厂)模式

/ 0评 / 0

Published by orzz.org(). (https://orzz.org/c%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bfactory%e5%b7%a5%e5%8e%82%e6%a8%a1%e5%bc%8f/)

工厂模式一般是学习设计模式的第一课,它本身也是创建型模式中较为常用的一种模式.

工厂模式希望解决的是"如何高效而方便的创建当前需要的对象"的问题.当一个对象对外提供的接口稳定,而这类对象的具体实现容易发生变化时,我们可以考虑使用工厂来封装对象的实现变化,并提供统一的对象创建方法.

工厂模式可以分为三种不同的模式,分别对应不同情况下的解决方案.

简单工厂通过一个工厂类对象创建出所有的产品类.通过外部给予的条件参数,动态的创建出不同的产品类的实例.类图如下:

示例代码:

调用方式:

简单工厂在所有工厂模式中实现上最为简便,而且并不需要很多的工厂类,同时很好的将产品类的创建过程封装,并解耦产品类实现与调用.

它最大的硬伤在于工厂类内部包含了所有具体产品类的构建.当我们需要增加某个产品类,或者修改某个产品类的构建方式时,我们就不得不修改工厂类.

下面的工厂方法模式可以解决这个问题.

工厂方法模式通过一个工厂接口定义多个工厂类对象,将创建具体产品类的工作推迟到单独的工厂子类当中,从而将具体的产品类创建过程与工厂类对象解耦.类图如下:

工厂方法模式类图

示例代码:

调用方式:

可以看到,此时当我们需要增加一个新的产品时,只需要增加一个对应的工厂类即可,不需要修改原来的任何代码.

从上面的叙述中,我们似乎感觉问题已经比较完美的解决了,那么抽象工厂与工厂方法相比又优化了哪些地方呢?

工厂方法可以针对同一系列产品接口提供同一系列的工厂类,但是若我们有多个产品系列,每个系列的接口各不相同,此时我们就需要定义多个工厂类系列,颇为不方便.

抽象工厂将各个产品系列的接口统一到一个工厂系列中,通过一个工厂类对象可以创建出所有系列的对应产品.类图如下:

抽象工厂模式类图

示例代码:

调用方式:

我们可以看到,这种情况下如果我们采用工厂方法模式,肯定会出现大量的工厂类,让我们在使用中非常的头疼,维护起来也颇为麻烦.抽象工厂模式将同一种构建方法的不同产品族放入同一个工厂中处理,让调用者可以更加专注于定位自己需要的产品,而不是去判断各种令人眼花缭乱的工厂类.

在实际使用中,工厂方法和抽象工厂的使用都不是很多.原因是它们的工厂类都太多了,而且抽象工厂的外部接口逻辑也比较复杂.我们可以试试看用一个简单工厂来解决上面抽象工厂的问题:

整个代码简洁明了,调用接口也很清晰.因此简单工厂是工厂模式中最为实用的一种了.唯一麻烦的地方就在于维护工厂内部逻辑上.往往为了达到通用的处理接口,工厂内部实现不会使用switch-case或者if-else,而采用RTTI或者类似的机制来完成类的动态创建.此时的工厂就是一个非常有力的武器,既有简单工厂的简洁清晰,又有抽象工厂添加改写的方便性.

运用好工厂模式,可以比较完美的解决多系列对象创建的需求变化,在使用之前必须将变化本身彻底封装入产品类,并提取出固定不变的通用接口.可以说,工厂模式彻底诠释了OOP面向接口编程的特征,融会贯通的用好了工厂模式,我们也就学会了如何将面向接口编程的思想代入到程序的其他需求实现中.


下面给出完整的示例代码:

Published by orzz.org(). (https://orzz.org/c%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8bfactory%e5%b7%a5%e5%8e%82%e6%a8%a1%e5%bc%8f/)

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据