在网上的大多数资料里面,将工厂模式分为:简单工厂、工厂方法、抽象工厂,他们之间的联系(以电子厂为例)如下:
那么该文章首先讲解工厂模式是什么,为什么需要工厂模式,最后再对三种模式进行示例。该文章是23招做项目的第一篇文章,参考文献和其他设计模式的讲解看专栏,现在2020.8.06正在逐步更新。
1. 工厂模式是什么
工厂模式的主要应用是在工具包和框架。工厂模式要解决的问题是:解决接口没法new的问题,希望能够创建一个对象,但创建过程比较复杂,希望对外隐藏这些细节。实质是new的一个替代品,任何你需要创建对象,而又不想指明它的具体class的时候都可以用。
在平时编程中,构建对象最常用的方法就是new一个对象,这种new对象方法属于一种硬编码,在比较小的项目里面是没有什么毛病的,但是在大的项目里面会出现一个问题。每new一个对象,相当于调用者多知道一个类,增加了类与类之间的联系,不利于程序的松耦合,容易搞成屎山。其实构建过程可以被封装起来,工厂模式便是封装对象的设计模式。
打个比方,直接new一个对象相当于我们做肯德基的新奥尔良汉堡的时候,我们不仅要知道鸡排是调味道的\还要知道怎么样揉面包才使得面包比较松软,但是有了新奥尔良汉堡工厂就不一样了,管他什么三七二十一,有现成的面包和调好味道的鸡扒,将鸡扒的烤好塞进去就完事了。
以做汉堡为例:
//C++,这是汉堡工厂
//作者:阿伟加油鸭,首发于CSDN,禁止转载,原文网址:https://blog.csdn.net/qq_45877524/article/details/107778702
class HumbegerFactory
{
public:
Humbeger * createHumbeger(string type){
switch(type){
case "鳕鱼汉堡": return new CodBurger();
case "牛肉汉堡": return new BeefBurger();
}
};
//C++,这是调用者
//作者:阿伟加油鸭,首发于CSDN,禁止转载,原文网址:https://blog.csdn.net/qq_45877524/article/details/107778702
class User{
private:
void eat(){
HumbegerFactory humbegerFactory = new HumbegerFactory();
Humbeger codBurger = humbegerFactory.createHumbeger("鳕鱼汉堡");
Humbeger beefBurger = humbegerFactory.createHumbeger("牛肉汉堡");
codBurger.eat();
beefBurger.eat();
}
};
事实上,将构建过程封装的好处不仅可以降低耦合,如果产品的构造十分复杂,使用工厂模式可以减少代码重复。比如,生产一个新奥尔良汉堡需要面包、鸡扒时,可以将汉堡工厂修改如下:
//C++,这是汉堡工厂的2.0版本
//作者:阿伟加油鸭,首发于CSDN,禁止转载,原文网址:https://blog.csdn.net/qq_45877524/article/details/107778702
class HumbegerFactory
{
public:
Humbeger * createHumbeger(string type){
switch(type){
case "鳕鱼汉堡":
//修改部分
Breed codBurgerBreed = new CodBurgerBreed();
return new CodBurger();
case "牛肉汉堡": return new BeefBurger();
}
};
不太懂耦合概念的小伙伴,可以看一下这个杨博的回答讲的非常好:程序设计经常提到的解耦,到底是要解除什么之间的耦合?
而调用者的代码则完全不需要改变,而且调用者不需要在每次做汉堡的时候,自己去揉面包、调鸡扒的味道,搞了半天才弄出个汉堡。面包揉的方法再复杂,也是工厂的事情,与我无关,这就是封装的好处。而且,万一有一天广东的汉堡厂要去提供鸡扒给湖南的肯德基,那就直接在工厂里面加点辣就🆗了,湖南的门店就不用特意加拉。
其实在不知不觉间已经完成了简单工厂的代码,在开始三个模式的论述,我想要解决一个问题:为什么工厂方法不用构造函数?
2. 既然有了构造函数,我为什么要折腾这么多事情,我直接一个东西全部构造了不就完事了吗
注意该段观点来自于: 工厂模式(factory Method)的本质是什么?为什么引入工厂模式?中大佬:高宽宽的回答
既然有了构造函数,我为什么要折腾这么多事情,我直接一个东西全部构造了不就完事了吗。为了解答这个问题,首先解释一下构造函数是干嘛地。
对于C语