C#面向对象设计模式1:简单工厂

简单工厂模式,它实际不是面向对象的设计模式,所以标题是错误的。而这个错误,在网上到处都是。你一搜一大堆,而那些作者大多数都没有意识到这个问题。

但作为面向对象设计模式的开篇,还是从简单工厂方法的介绍和编写入手。整个系列文章以中文编码是为了给您阅读方便。

 

一、定义

简单工厂模式描述了一个类, 它拥有一个包含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

 

祝您用餐愉快。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值