简单工厂方法模式

https://itbaima.net/document
当我们需要对象时,直接调用工厂类中的工厂方法来为我们生成对象,这样,就算类出现了变动,我们也只需要修改工厂中的代码即可,而不是大面积地进行修改。

#include <iostream>
#include <vector>
class Fruit
{
private:
    const std::string name;

public:
    Fruit(const std::string &_name) : name(_name){};
};
class FruitFactory
{
public:
    static Fruit getFruit(const std::string &type)
    {
        if (type == "apple")
        {
            return Fruit("apple");
        }
        else if (type == "orange")
        {
            return Fruit("orange");
        }
        else
        {
            return Fruit("unknown");
        }
    }
};
class Apple : public Fruit
{
public:
    Apple() : Fruit("apple"){};
};
class Orange : public Fruit
{
public:
    Orange() : Fruit("orange"){};
};

int main(void)
{
    Fruit apple = FruitFactory::getFruit("apple");
    Fruit orange = FruitFactory::getFruit("orange");
}

抽象工厂方法模式

使用抽象工厂模式,我们可以将多个产品,都放在一个工厂中进行生成,按不同的产品族进行划分

#include <iostream>
#include <string>

class Phone
{
private:
    std::string name;
    int value;

public:
    Phone(const std::string &_name, int _value) : name(_name), value(_value) {}
};

class Table
{
};

class Router
{
};

class AbstractFactory
{
public:
    virtual Phone getPhone(const std::string& _name, int _value) = 0;
    virtual Table getTable() = 0;
    virtual Router getRouter() = 0;
};

class Factory : public AbstractFactory
{
public:
    Phone getPhone(const std::string& _name, int _value) override
    {
        return Phone(_name, _value);
    }

    Table getTable() override
    {
        return Table();
    }

    Router getRouter() override
    {
        return Router();
    }
};

int main()
{
    Factory factory;
    Phone phone = factory.getPhone("iPhone", 1000);
    Table table = factory.getTable();
    Router router = factory.getRouter();

    // 在这里使用创建的对象...

    return 0;
}