设计模式(二)——简单工厂模式

工厂(Factory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
抽象产品(AbstractProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂模式所创建的具体实例对象。

优点:
1. 实现了对象创建和使用的分离。
2. 不需要记住具体类名,记住参数即可,减少使用者记忆量。
缺点:
1. 对工厂类职责过重,一旦不能工作,系统受到影响。
2. 增加系统中类的个数,复杂度和理解度增加。
3. 违反“开闭原则”,添加新产品需要修改工厂逻辑,工厂越来越复杂。

适用场景
1. 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成方法中的业务逻辑太过复杂。
2. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心

#include <iostream>
using namespace std;

#if 0
class Fruit
{
public:
    Fruit(string kind)
    {
        this->kind = kind;
        if (kind == "apple") {
            // 代表苹果
        }
        if (kind == "banana") {
            //代表香蕉
        }
    }

    void get_name()
    {
        if (this->kind == "apple") {
            cout << "我是苹果" << endl;
        }
        else if (this->kind == "apple") {
            cout << "我是香蕉" << endl;
        }
    }

private:
    string kind;// 代表水果的种类
};

int main()
{
    ////////////////////////////////////////////////////////////////////
    // main函数跟Fruit类的构造函数耦合度高,随着水果种类的增加,构造函数越来越复杂
    // 为了将main函数和构造函数隔离,设计工厂模式
    ////////////////////////////////////////////////////////////////////
    Fruit* apple = new Fruit("apple");
    apple->get_name();
    delete apple;

    system("pause");
    return 0;
}
#endif

// 简单工厂模式实现
class Fruit
{
public:
    virtual void get_name() = 0;
};

class Apple :public Fruit
{
public:
    virtual void get_name()
    {
        cout << "我是苹果" << endl;
    }
};

class Banana :public Fruit
{
public:
    virtual void get_name()
    {
        cout << "我是香蕉" << endl;
    }
};

// 增加一个品种 Pear
class Pear :public Fruit
{
public:
    virtual void get_name()
    {
        cout << "我是鸭梨" << endl;
    }
};


// 工厂
class Factory
{
public:
    Fruit * create_fruit(string kind)
    {
        if (kind == "apple") {
            return new Apple;
        }
        else if (kind == "banana") {
            return new Banana;
        }
        // 添加一个鸭梨,修改了工厂的方法,违背了开闭原则
        else if (kind == "pear") {
            return new Pear;
        }
    }
};

int main()
{
    // 人们是跟工厂打交道
    Factory* factory = new Factory;// 创建一个工厂
    Fruit* apple = factory->create_fruit("apple");
    apple->get_name();

    delete factory;
    delete apple;
    system("pause");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xiangtingshen/p/10356720.html