23招做项目——工厂模式:工厂方法和抽象工厂

本文介绍了工厂模式,包括简单工厂、工厂方法和抽象工厂。通过实例解释了工厂模式的作用,即解决接口无法直接new的问题,降低耦合度。文章讨论了为什么需要工厂模式而非直接使用构造函数,并探讨了各种工厂模式的优缺点及其适用场景。
摘要由CSDN通过智能技术生成

在网上的大多数资料里面,将工厂模式分为:简单工厂、工厂方法、抽象工厂,他们之间的联系以电子厂为例)如下:
在这里插入图片描述
那么该文章首先讲解工厂模式是什么,为什么需要工厂模式,最后再对三种模式进行示例。该文章是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语

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值