漫谈设计模式之简单工厂模式

什么是简单工厂模式?简单工厂模式属于类的创建型模式,又叫静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例。被创建的实例通常都具有共同的父类。


简单工厂模式中包含的角色及其职责

----1、工厂(creator)角色:工厂角色是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

----2、抽象(abstract product)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

----3、具体产品(concrete product)角色:简单工厂模式所创建的具体实例对象。

  漫谈设计模式之简单工厂模式_第1张图片

     //依赖:一个类的对象当另外一个类的函数参数或者是返回值(简单工厂模式的设计基础(原理)是基于多态)


简单工厂模式的优缺点:在简单工厂模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建和组织的。有利于整个软件体系结构的优化。不难发现简单工厂模式的缺点也正体现在其工厂类上。由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时可能会出现要求工厂类也要做相应的修改,扩展性不是很好。


简单工厂模式的实例代码:

#include 
#include 
using namespace std;


/**
 * @brief The Fruit class
 * Fruit类充当抽象产品角色
 */
class Fruit
{
public:
    virtual void getFruit()=0;
    virtual ~Fruit() {}

protected:
private:

};

/**
 * @brief The Banana class
 * Banana是具体的产品类
 */
class Banana : public Fruit
{
public:
    virtual void getFruit() {
        cout<<"Iam banana,enjoy me~\n";
    }

protected:
private:
};

/**
 * @brief The Apple class
 * Apple是具体的产品类
 */
class Apple : public Fruit
{
public:
    virtual void getFruit() {
        cout<<"Iam apple,enjoy me~\n";
    }

protected:
private:
};


class Factory
{
public:
    Fruit* createProduct(string product) {
        if("banana" == product) {
            return new Banana;
        } else if("apple" == product) {
            return new Apple;
        } else {
            cout<<"These is no such product in our factory!\n";
            return NULL;
        }
        return NULL;
    }
};









int main()
{
    Factory* factory = new Factory;

    Fruit* fruit = NULL;

    //工厂生产香蕉
    fruit = factory->createProduct("banana");
    fruit->getFruit();
    delete fruit;
    fruit = NULL;

    //工厂生产苹果
    fruit = factory->createProduct("apple");
    fruit->getFruit();
    delete fruit;
    fruit = NULL;

    //工厂生产工厂没有的产品
    fruit = factory->createProduct("money");
    //fruit->getFruit();  //error! 这时的fruit(NULL)没有getFruit()这个接口

    //如果现在要生产西红柿就要修改Factory 的
    //Fruit* createProduct(string product)接口
    //这违背了设计模式的开闭原则(增加新功能不修改原来代码),
    //所以简单工厂不属于标准的设计模式


    delete factory;
    factory = NULL;

    return 0;
}


运行结果:

漫谈设计模式之简单工厂模式_第2张图片


虽然简单工厂模式不是标准的设计模式,不符合设计模式的开闭原则即增加新功能不修改原来的代码,但是很多场合用起来还是相当的方便。

希望LZ的文章对你有帮助,不足和有误的地方多多指教!

Enjoy coding~

你可能感兴趣的:(设计模式)