简单工厂模式,它实际不是面向对象的设计模式,所以标题是错误的。而这个错误,在网上到处都是。你一搜一大堆,而那些作者大多数都没有意识到这个问题。
但作为面向对象设计模式的开篇,还是从简单工厂方法的介绍和编写入手。整个系列文章以中文编码是为了给您阅读方便。
一、定义
简单工厂模式描述了一个类, 它拥有一个包含if/else条件语句的构建方法, 可根据方法的参数来选择对何种产品进行初始化并将其返回。
人们通常会将简单工厂与普通的工厂或其它创建型设计模式混淆。 简单工厂是“工厂方法模式”和“抽象工厂模式”的过程式编码,纯粹的if/else、switch即可。
简单工厂通常没有子类。 但当从一个简单工厂中抽取出子类后, 它看上去就会有点像“工厂方法模式”了。
如果你以为将一个简单工厂声明为 abstract
类型, 它就神奇地变成“抽象工厂模式”,是错误的。
什么是“工厂”?
是类似于我们现实生活中的真正的那种工厂来比喻的。咱们现实中的工厂,就是用来生产产品的。所以代码世界中的“工厂”,也是用来生产产品的,只不过它是用来生产“对象”。一个抽象的产品接口,可以派生出很多产品,通过工厂方法可以new出指定的产品对象。这就是代码世界中的“工厂”。
二、UML定义
由于简单工厂模式不是面向对象的设计模式,所以它没有专门的UML。如果有,那么就请看下图:
三、使用场景
极其简单的需要统一创建产品对象时,可以使用。
简单工厂,正如它的名字所述的那样,特别简单,对于需要快速生成获得产品对象而不想写那么写那么多类时,简单工厂就是最佳选择,您只需要switch、if/else即可完成,高效明了快捷。“简单”2字诠释的非常好。
四、编码过程
1.让所有产品都遵循同一个接口,这个接口定义好所有产品的公共成员。
2.在创建者类中,添加一个带有产品的类型参数的工厂方法,该方法返回抽象的产品接口。
3.在工厂方法中,使用条件语句(if/else、switch)编写您的产品创建逻辑。
4.如果需要,可以在工厂方法中,当类型参数为空时,使用默认的产品创建。
五、生成代码
以菜品为例,会有多个菜品,如酸菜鱼、手撕鸡、黑椒牛柳等,这些菜品是我们的产品,它们的共性是都具有相应的制作方法。
当有客人下订单时,厨房需要根据客人所下单的菜品来制作。
1.抽象出一个所有菜品适用的接口,并定义好它们的公共成员,有一个“制作”方法
2.定义好我们的产品,本店提供以下3道菜品
3.定义我们的厨房类,厨房中提供一个工厂方法“获取菜品”,其中需要一个菜品类别的参数,由客人下单后指定
4.客户端做一个简单的调用,厨房根据客人想要的手撕鸡,得到菜品对象,然后通过菜品对象的制作方法,做出手撕鸡这道菜。
五、说明
1.简单工厂模式,是面向过程编程,它并不属于面向对象的设计模式之一,关于这点网上很多文章将其定义设计模式之一,我认为是错误的。
2.从简单工厂模式入手开篇,是因为后面将有“工厂方法模式”和“抽象工厂模式”,这两种都需要您有一个简单工厂的概念,才好入手。
3.绝大部分的程序员,都无法分清“简单工厂”、“工厂方法”和“抽象工厂”之间的区别,我将在写完这几篇文章后做最后总结。
4.网上大多数的面向对象设计模式教程讲解,其作者自身也搞不明白这3种模式之间的区别。而它们也大多避而不谈。
5.简单工厂模式,是一种极简的创建型方式,其典型代码编写方法就是使用if/else、switch来手动创建产品对象。
6.不论是哪种工厂模式,遇到大量的产品时,现在只是3道菜,如果有100道菜,满汉全席的时候,就会产生成百上千、几千行的if/else代码。
源码下载:
https://download.csdn.net/download/mazhiyuan1981/13196340
祝您用餐愉快。