十分钟学会一个设计模式---创建模式---工厂模式、抽象工厂

82 阅读1分钟

一、工厂模式

1. 简单工厂

不符合开闭原则,故不在23种设计模式中

class Fruit {
public:
    virtual ~Fruit() = default;
    virtual void Process() = 0;
};

class Apple : public Fruit{
public:
    void Process() override {
        cout << "apple" << endl;
    }
};

class Banana : public Fruit{
public:
    void Process() override {
        cout << "banana" << endl;
    }
};

class Factory {
public:
    Fruit* Create(const char * fruit) {
        if (strcmp(fruit, "apple") == 0) { // 不符合开闭原则,新增产品需要修改此处的代码
            return new Apple;
        } else {
            return new Banana;
        }
    }
};

int main() {
    Factory* factory = new Factory;
    auto apple = factory->Create("apple");
    apple->Process();
    delete apple;
    delete factory;
}

2. 工厂方法

class Fruit {
public:
    virtual ~Fruit() = default;
    virtual void Process() = 0;
};

class Apple : public Fruit{
public:
    void Process() override {
        cout << "apple" << endl;
    }
};

class Banana : public Fruit{
public:
    void Process() override {
        cout << "banana" << endl;
    }
};

class Factory {
public:
    virtual ~Factory() = default;
    virtual Fruit* Create() = 0;
};

class AppleFctory : public Factory{ // 可进行扩展
    Fruit * Create() override {
        return new Apple;
    }
};

int main() {
    Factory* factory = new AppleFctory;
    auto apple = factory->Create();
    apple->Process();
    delete apple;
    delete factory;
}

3. 抽象工厂

class Product {
public:
    virtual ~Product() = default;
    virtual void Show() = 0;
};

// 鼠标
class Mouse: public Product{};
class LogiMouse : public Mouse {
    void Show() override {
        cout << "罗技 Mouse";
    }
};

class RazerMouse : public Mouse {
    void Show() override {
        cout << "雷蛇 Mouse";
    }
};

// 键盘
class Keyboard : public Product{};
class LogiKeyboard : public Keyboard {
    void Show() override {
        cout << "罗技 Keyboard";
    }
};

class RazerKeyboard : public Keyboard {
    void Show() override {
        cout << "雷蛇 Keyboard";
    }
};

// 抽象工厂
class Factory {
public:
    virtual ~Factory() = default;
    virtual Mouse* CreateMouse() = 0;
    virtual Keyboard* CreateKeyBoard() = 0; //若再增加产品不符合开闭原则
};

class LogiFactory : public Factory {
    Mouse * CreateMouse() override{
        return new LogiMouse;
    }
    Keyboard * CreateKeyBoard() override {
        return new LogiKeyboard;
    }
};

class RazerFactor :public Factory {
    Mouse * CreateMouse() override{
        return new RazerMouse;
    }
    Keyboard * CreateKeyBoard() override {
        return new RazerKeyboard;
    }
};


int main() {
    Factory* factory = new LogiFactory;
    Mouse* logiMouse = factory->CreateMouse();
    Keyboard* logiKeyboard = factory->CreateKeyBoard();
    logiMouse->Show();
    logiKeyboard->Show();
    delete logiKeyboard;
    delete logiMouse;
    delete factory;
    logiMouse = nullptr;
    logiKeyboard = nullptr;
    factory = nullptr;
}