工厂模式(C++)

转载来源:https://www.runoob.com/design-pattern/ios

工厂模式

建立型模式,它提供了一种建立对象的最佳方式。
在工厂模式中,咱们在建立对象时不会对客户端暴露建立逻辑,而且是经过使用一个共同的接口来指向新建立的对象。数据库

介绍

[意图]:定义一个建立对象的接口,让其子类本身决定实例化哪个工厂类,工厂模式使其建立过程延迟到子类进行。服务器

[主要解决]:主要解决接口选择的问题。框架

[什么时候使用]:咱们明确地计划不一样条件下建立不一样实例时。
[如何解决]:让其子类实现工厂接口,返回的也是一个抽象的产品。
[关键代码]:建立过程在其子类执行。
[应用实例]ide

  • 您须要一辆汽车,能够直接从工厂里面提货,而不用去管这辆汽车是怎么作出来的,以及这个汽车里面的具体实现。
  • Hibernate 换数据库只需换方言和驱动就能够。

[优势]设计

  • 一个调用者想建立一个对象,只要知道其名称就能够了。
  • 扩展性高,若是想增长一个产品,只要扩展一个工厂类就能够。
  • 屏蔽产品的具体实现,调用者只关心产品的接口。

[缺点]:每次增长一个产品时,都须要增长一个具体类和对象实现工厂,使得系统中类的个数成倍增长,在必定程度上增长了系统的复杂度,同时也增长了系统具体类的依赖。日志

[使用场景]code

  • 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户能够选择记录日志到什么地方。
  • 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
  • 设计一个链接服务器的框架,须要三个协议,"POP3"、"IMAP"、"HTTP",能够把这三个做为产品类,共同实现一个接口。

[注意事项]:做为一种建立类模式,在任何须要生成复杂对象的地方,均可以使用工厂方法模式。有一点须要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只须要经过 new 就能够完成建立的对象,无需使用工厂模式。若是使用工厂模式,就须要引入一个工厂类,会增长系统的复杂度。对象

实现

#include <iostream>
#include <memory>


template<typename T>
class Shape
{
public:
    virtual ~Shape(){}
    virtual void draw()=0;
protected:
    Shape(){}
};

template<typename T>
class Circle : public Shape<T>
{
public:
    virtual void draw() override
    {
        std::cout << "draw a Circle" << std::endl;
    }
};

template<typename T>
class Square : public Shape<T>
{
public:
    virtual void draw() override
    {
        std::cout << "draw a Square" << std::endl;
    }
};

template<typename T>
class Rectangle : public Shape<T>
{
public:
    virtual void draw() override
    {
        std::cout << "draw a Rectangle" << std::endl;
    }
};


template<typename T>
class ShapeFactory
{
public:
    std::shared_ptr<Shape<T>> getShape(std::string shapeType)
    {
        if(shapeType.empty())
            return nullptr;
        
        if(shapeType == "Circle")
            return std::make_shared<Circle<T>>();
        else if(shapeType == "Square")
            return std::make_shared<Square<T>>();
        else if(shapeType == "Rectangle")
            return std::make_shared<Rectangle<T>>();
        else
            return nullptr;
    }
};

int main(void)
{
    std::shared_ptr<ShapeFactory<int>> shapeFactory = std::make_shared<ShapeFactory<int>>();

    std::shared_ptr<Shape<int>> shape1 = shapeFactory->getShape("Circle");
    shape1->draw();

    std::shared_ptr<Shape<int>> shape2 = shapeFactory->getShape("Square");
    shape2->draw();

    std::shared_ptr<Shape<int>> shape3 = shapeFactory->getShape("Rectangle");
    shape3->draw();


    return 0;
}
相关文章
相关标签/搜索