Bootstrap

C++工厂模式

C++工厂模式

一、工厂模式是什么?

是C++多态的一种很好的具体表现。通过继承,重写抽象父类的虚函数,并在main函数中通过基类指针指向子类对象的一种编码风格

二、为什么使用工厂模式

1.如果每次需要的对象构造过程都比较复杂,那么就需要很多行的代码去能去创建一个对象。这样就比较麻烦!

2.如果在别的类中又需要创建该对象,那么代码的重复度就很高。

3.需要通过一个工具类,把每个对象创建的具体逻辑给隐藏起来,且只对外分别暴露一个个调用方法。这样就减少了代码量,以后如果想改代码的话,只需要改一处即可,也方便我们日常的维护。

4.该工具类就是工厂模式思想落地实现的一种具体情况,现在只不过很多框架都会自带工厂模式的实现接口。一般不需要我们自己手写,只需简单配置一下就可以使用了

二、怎样实现

1.简单工厂模式

只有一个抽象类,所以它存在的缺点是工厂类中集中了所有的创建逻辑,高内聚的问题并没有得到解决。当需要增加产品时,工厂类需要进行修改,违背了六大准则第一条开闭原则,没有良好的扩展性。但它存在并非偶然,优点是对外隐藏了内部的创建,有利于整个结构的优化。
需要的类
(1)抽象产品类(作为个具体产品基类 、 包含共有的可显示自身产品信息的纯虚方法、 析构函数需要定义为虚函数(多态方面原因))
(2)具体产品类
(3)抽象工厂类(有创建具体产品的方法)

代码如下(示例):使用静态局部变量


#include <iostream>

typedef enum
{
    Shoes,
    Coat,
    Pants
}CLOTHTYPE;

class clothing
{
public:
    virtual void show() = 0;
    virtual ~clothing() {}
};

class shoes:public clothing
{
public:
    void show()
    {
        std::cout << "I'm shoes!" << std::endl;
    };    
};

class coat :public clothing
{
public:
    void show()
    {
        std::cout << "I'm coat!" << std::endl;
    }
};

class pants:public clothing
{
public:
    void show()
    {
        std::cout << "I'm pants!" << std::endl;
    }
};

class factory
{
public:
    clothing* producecloth(CLOTHTYPE clothtype)
    {
        switch (clothtype)
        {
        case Shoes:return new shoes();
        case Coat:return new coat();
        case Pants:return new pants();
        default:
            return NULL;
        }
    }
};
int main()
{
    factory m_factory;
    clothing* coat1 = m_factory.producecloth(CLOTHTYPE::Coat);
    if(coat1)
     coat1->show();

    clothing* shoes1 = m_factory.producecloth(CLOTHTYPE::Shoes);
    if (shoes1)
        shoes1->show();

    clothing* pants1 = m_factory.producecloth(CLOTHTYPE::Pants);
    if (pants1)
        pants1->show();

    std::cout << "Hello World!\n";
}


输出结果

I'm coat!
I'm shoes!
I'm pants!
Hello World!

注:


2.工厂方法模式

一个具体的工厂生产一个具体的产品
需要的类
(1)抽象产品类(作为个具体产品基类 、 包含共有的可显示自身产品信息的纯虚方法、 析构函数需要定义为虚函数(多态方面原因))
(2)具体产品类(继承抽象产品类)
(3)抽象工厂类(工厂方法模式的核心类,提供创建具体产品的接口,由具体工厂类实现)
(4)具体工厂类(继承于抽象工厂,实现创建对应具体产品对象的方式)

代码如下(示例)

#include <iostream>

class Clothing
{
public:
    virtual void show() = 0;
    virtual ~Clothing() {}
};

class Cloes :public Clothing
{
    void show()
    {
        std::cout << "I'm cloes!" << std::endl;
    }
};

class Coat :public Clothing
{
    void show()
    {
        std::cout << "I'm coat!" << std::endl;
    }
};


class Factory
{
public:
    virtual Clothing* creatfactory() = 0;
    virtual ~Factory() {}
};

class ShoesFactory:public Factory
{
public:
    Clothing* creatfactory()
    {
        return new Cloes;
    }
};

class CoatFactory :public Factory
{
public:
    Clothing* creatfactory()
    {
        return new Coat;
    }
};



int main()
{
    Factory* shoes_factory = new ShoesFactory();
    Clothing * m_shoes = shoes_factory->creatfactory();
    if (m_shoes)
    {
        m_shoes->show();
        delete m_shoes;
        m_shoes = NULL;
    }

    Factory* coat_factory = new CoatFactory();
    Clothing* m_coat = coat_factory->creatfactory();
    if (m_coat)
    {
        m_coat->show();
        delete m_coat;
        m_coat = NULL;
    }
    //std::cout << "Hello World!\n";
}

输出结果

I'm cloes!
I'm coat!

3、抽象工厂模式

一个具体的工厂可生产多个产品
需要的类
(1)抽象产品类(作为个具体产品基类 、 包含共有的可显示自身产品信息的纯虚方法、 析构函数需要定义为虚函数(多态方面原因))
(2)具体产品类(继承抽象产品类)
(3)抽象工厂类(工厂方法模式的核心类,提供创建具体产品的接口,由具体工厂类实现)
(4)具体工厂类(继承于抽象工厂,实现多个创建对应具体产品对象的方式)

代码如下(示例)


#include <iostream>

class Clothing
{
public:
    virtual void show() = 0;
    virtual ~Clothing(){}
};

class Coat :public Clothing
{
    void show()
    {
        std::cout << "I'm coat!" << std::endl;
    }
};

class Shoes :public Clothing
{
    void show()
    {
        std::cout << "I'm shoes!" << std::endl;
    }
};
class ComplexFactory
{
public:
    virtual Clothing*  CreateCoat() = 0;
    virtual Clothing* CreateShoes() = 0;
    virtual ~ComplexFactory(){}
};

class ClothesFactory :public ComplexFactory
{
public:

    Clothing* CreateCoat()
    {
        return new Coat();
    }

    Clothing* CreateShoes()
    {
        return new Shoes();
    }
};

int main()
{
    ComplexFactory* m_coatfactory = new ClothesFactory();
    Clothing* m_coat = m_coatfactory->CreateCoat();
    if (m_coat)
    {
        m_coat->show();
        delete m_coat;
        m_coat = NULL;
    }

    Clothing* m_shoes = m_coatfactory->CreateShoes();
    if (m_shoes)
    {
        m_shoes->show();
        delete m_shoes;
        m_shoes = NULL;
    }
}

输出结果

I'm coat!
I'm shoes!
;