设计模式_工厂模式详解【建议收藏】

举报
Linux猿 发表于 2021/09/30 18:09:57 2021/09/30
【摘要】 设计模式_工厂模式详解

 🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


工厂模式包括简单工厂模式、工厂方法模式和抽象工厂模式。

1 简单工厂模式

优点:

客户端只需要知道传入工厂类的参数的含义,对如何创建工厂对象不需要关心。

只需要创建一个工厂 

举个栗子来加深理解:假如有一个工厂生产两中型号的产品,分别为产品A和产品B。那么很容易我们就可以写出如下代码:

#include<iostream>
using namespace std;
 
class Product{   //抽象类
    public:
        virtual void show() = 0;
};
 
class Product_A : public Product{
    public:
        void show(){
            cout << "Product_A" << endl;
        }
};
 
class Product_B : public Product{
    public:
        void show(){
            cout << "Product_B" << endl;
        }
};
 
class Factory{
    public:
        Product* Create(int i){
            switch (i){
                case 1:
                    return new Product_A;
                    break;
                case 2:
                    return new Product_B;
                    break;
                default:
                    return NULL;
                    break;
            }
        }
};
int main(){
    Factory *factory = new Factory();
    factory->Create(1)->show();
    factory->Create(2)->show();
    return 0;
}

  从上面我们可以看出,简单工厂模式需要就是一个工厂生产多种产品,需要告诉工厂生产什么产品。但是考虑到如果工厂需要增加一种产品,那么就需要改工厂类的代码,这就违反了开放封闭原则:类、模板、函数可以扩展,但是最好不要修改。所以就出现了工厂方法模式。

2 工厂方法模式

    优点:克服了简单工厂违背开放封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性,可以说“工厂方法模式”是简单工厂模式的进一步抽象和推广。

    举个栗子:有多个工厂,多个产品,每一个工厂生产一种产品。相对于简单工厂模式,每增加一种产品,就增加一个工厂,增加工厂属于扩展,不会修改以前工厂类和产品的任何代码。具体代码如下:

#include<iostream>
using namespace std;
 
class Product{
    public:
        virtual void show() = 0;
};
 
class Product_A : public Product{
    public:
        void show(){
            cout << "Product_A" << endl;
        }
};
 
class Product_B : public Product{
    public:
        void show(){
            cout << "Product_B" << endl;
        }
};
 
class Factory{
    public:
        virtual Product* create() = 0;
};
 
class Factory_A : public Factory{
    public:
        Product* create(){
            return new Product_A;
        }
};
 
class Factory_B : public Factory{
    public:
        Product* create(){
            return new Product_B;
        }
};
 
int main(){
    Factory* productA = new Factory_A();
    Factory* productB = new Factory_B();
 
    productA->create()->show();
    productB->create()->show();
    return 0;
}


    从上面代码我们可以看出,工厂方法模式,每增加一种产品,就需要增加一个对象的工厂,比较繁琐。然后,我们再考虑这样一种情况,如果每种产品有多种型号怎么办,是不是工厂方法模式又不适合了呢,那就用接下来介绍的抽象工厂模式。

3 抽象工厂模式

举个栗子:多个工厂,多个产品,并且每个产品可以包含多个型号。具体代码如下:

#include <iostream>
using namespace std;
 
//定义抽象类
class product_1{//型号1
    public:
        virtual void show() = 0;
};
 
//定义具体类
class product_A1 :public product_1{
    public:
        void show(){ cout << "product A1" << endl; }
};
 
class product_B1 :public product_1{
    public:
        void show(){ cout << "product B1" << endl; }
};
 
//定义抽象类
class product_2{//型号2
    public:
        virtual void show() = 0;
};
 
//定义具体类
class product_A2 :public product_2{
    public:
        void show(){ cout << "product A2" << endl; }
};
 
class product_B2 :public product_2{
    public:
        void show(){ cout << "product B2" << endl; }
};
 
class Factory{
    public:
        virtual product_1 *creat1() = 0;
        virtual product_2 *creat2() = 0;
};
 
class FactoryA : Factory{
    public:
        product_1 *creat1(){ return new product_A1(); }
        product_2 *creat2(){ return new product_A2(); }
};
 
class FactoryB : Factory{
    public:
        product_1 *creat1(){ return new product_B1(); }
        product_2 *creat2(){ return new product_B2(); }
};
 
int main(){
    FactoryA *factoryA = new FactoryA();
    factoryA->creat1()->show();
    factoryA->creat2()->show();
 
    FactoryB *factoryB = new FactoryB();
    factoryB->creat1()->show();
    factoryB->creat2()->show();
 
    return 0;
}

🎈 有任何疑问欢迎交流!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。