前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工厂模式工厂方法简单工厂抽象工厂

工厂模式工厂方法简单工厂抽象工厂

作者头像
用户2929716
发布2018-08-23 13:23:19
4770
发布2018-08-23 13:23:19
举报
文章被收录于专栏:流媒体流媒体

工厂模式分三类:

  • 简单工厂
  • 工厂方法
  • 抽象工厂

简单工厂不属于设计模式,因为其违背了设计模式的开闭原则,后面会有介绍。

工厂方法

factory_function.png

相关元素:

  • 抽象工厂
  • 具体工厂
  • 抽象产品
  • 具体产品

示例

抽象产品

代码语言:javascript
复制
class Car {
public:
    virtual void printInfo()=0;
};

具体产品

代码语言:javascript
复制
class BenChi :public Car {
public:
    void printInfo() {
        cout << "BenChi" << endl;
    }
};

class Aodi :public Car {
public:
    void printInfo() {
        cout << "Aodi" << endl;
    }
};

抽象工厂

代码语言:javascript
复制
class AbstractFactory {
public:
    virtual Car * createCar() = 0;
};

具体工厂:

代码语言:javascript
复制
class FactoryBenchi :public AbstractFactory {
public:
    Car * createCar() {
        return new BenChi();
    };
};

class FactoryAodi :public AbstractFactory {
public:
    Car * createCar() {
        return new Aodi();
    };
};

这是一个比较标准的工厂方法设计模式。车可以生产车,那具体的奥迪车工厂可以生产奥迪车,奔驰车工厂可以生产奔驰的车。当需要生产法拉利的车时,我们只需要实现一个法拉利的产品,然后实现一个法拉利的工厂即可,而不需要修改之前的代码。这符合开闭原则。

简单工厂

factory_simple.png

这是工厂模式的简单实现方式,包含元素

  • 工厂类
  • 抽象产品
  • 抽象方法

示例

这里抽象产品和抽象方法和前面一样。 工厂类

代码语言:javascript
复制
class SimpleFactory{
public:
    static Car * createCar(const string type) {
        if (type == string("benchi")) {
            return new BenChi();
        }
        else if (type == string("aodi")) {
            return new Aodi();
        }
        else {
            return NULL;
        }
    }
};

我们看到工厂类就是一个单独的类,通过传入的参数来区分返回什么样的产品。比如:当需要生产法拉利时,我们需要修改工厂类的方法。这不符合开闭原则,所以它不属于设计模式。只是工厂模式的一个变相简单的实现。

抽象工厂

前面说到工厂方法只能生产一个类型的产品。当我们需要生产一系列的产品,比如:我们需要奥迪的发动机,那么肯定也是在奥迪的工厂生产,那么这里就可以使用抽象工厂设计模式

元素

  • 抽象工厂
  • 具体工厂
  • 抽象产品(多个)
  • 具体产品

示例

这里我们再Car的基础上在增加一个产品Engine

代码语言:javascript
复制
class Engine {
public:
    virtual void printName() = 0;
};

实现类:

代码语言:javascript
复制
class EngineBenchi :public Engine {
public:
    void printName() {
        cout << "benchi engine" << endl;
    }
};

class EngineAodi :public Engine {
public:
    void printName() {
        cout << "aodi engine" << endl;
    }
};

抽象类也需要进行修改:

代码语言:javascript
复制
class AbstractFactory {
public:
    virtual Car * createCar() = 0;
    virtual Engine * createEngine() = 0;
};

实现类:

代码语言:javascript
复制
class FactoryBenchi :public AbstractFactory {
public:
    Car * createCar() {
        return new BenChi();
    };
    Engine * createEngine() {
        return new EngineBenchi();
    }
};

class FactoryAodi :public AbstractFactory {
public:
    Car * createCar() {
        return new Aodi();
    };
    Engine * createEngine() {
        return new EngineAodi();
    }
};

测试代码:

代码语言:javascript
复制
int main()
{
    AbstractFactory *factory = NULL;
    Car* car = NULL;
    Engine* engine = NULL;
    factory=new FactoryBenchi();
    car = factory->createCar();
    car->printInfo();
    engine = factory->createEngine();
    engine->printName();
    delete factory;
    delete car;
    delete engine;
    factory = new FactoryAodi();
    car = factory->createCar();
    car->printInfo();
    engine = factory->createEngine();
    engine->printName();
    delete factory;
    delete car;
    delete engine;
    return 0;
}

这样我们就完成的奥迪工厂既可以生产车,也可以生产发动机。同样我们也发现了他的缺点。当需要再添加一种商品时,发现需要修改很多地方。抽象工厂需要修改,同时所有的实现类都需要发生修改。产品的扩展很复杂。优点当然也明显,它是的产品族的多个产品设计在一起工作时,它能保证使用的是同一个产品族的产品。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.09.11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 工厂方法
    • 示例
    • 简单工厂
      • 示例
      • 抽象工厂
        • 元素
          • 示例
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档