暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

简单工厂模式C++实现

二进制人生 2020-07-25
408

目录

概念UML图实现优缺点

概念

创建型模式关注对象的创建过程,在软件开发中应用非常广泛。创建型模式描述如何将对象的创建和使用分离,让用户在使用对象过程中无须关心对象的创建细节,从而降低系统耦合度,并且让系统易于修改和扩展。

简单工厂模式是最简单的设计模式之一,同时也是其余创建模式的基础。定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

例如,有个生产球类运动器材的工厂。客户A下了一批单说要购买1万个篮球,客户B要购买5千个足球,工厂需要根据用户的不同需求生产相应的球给客户。篮球和足球都是球,它们是相似产品。

简单工厂基本实现流程

由上述例子,可以很容易总结出简单工厂的实现流程:

  • 设计一个抽象产品类Product,它包含一些公共方法的实现;

  • 从抽象产品类中派生出多个具体产品类ConcreteProduct,如篮球类、足球类、排球类,具体产品类中实现具体产品生产的相关代码;

  • 设计一个工厂类Factory,工厂类中提供一个生产各种产品的工厂方法,该方法根据传入参数(产品名称)创建不同的具体产品类对象;

  • 客户只需调用工厂类的工厂方法,并传入具体产品参数,即可得到一个具体产品对象。

UML图

这个示例里头,定义了一个运算基类,派生出具体的加减乘除子类;简单工厂类提供了一个生产函数createOperate(),通过给它传入"+、-、*、/"来构建具体的加减乘除类。

实现

#include <iostream>
using namespace std;

//抽象基类
class Product
{
public:
    void virtual MethodDiff() = 0; //声明抽象业务方法
    Product(const string &name):m_name(name)
    {
    }
    virtual ~Product()            //声明为虚析构
    {
        cout<<"product "<<m_name<<" destroy"<<endl;
    }    
protected:
    string m_name;
};

class ConcreteProductA : public Product
{
public:
    ConcreteProductA(const string &name):Product(name)
    {
    }
    void MethodDiff()
    {
       cout<<"I am ConcreteProductA"<<endl;
    }
};

class ConcreteProductB : public Product
{
public:
    ConcreteProductB(const string &name) : Product(name)
    {
    }
    void MethodDiff()
    {
        cout<<"I am ConcreteProductB"<<endl;
    }
};

class Factory
{
public:
Product *CreateProduct(const string &name)
  {
        Product *product = NULL;
        if(name == "A")
            product = new ConcreteProductA(name);
        else if(name == "B")

            product = new ConcreteProductB(name);

        return product;

  }
};

int main()
{
    Factory factory;
    Product *product;
    
    product = factory.CreateProduct("A"); //工厂类创建对象
    product->MethodDiff();
    delete product;

    product = factory.CreateProduct("B"); //工厂类创建对象
    product->MethodDiff();
    delete product;
}

优缺点

【优点】:客户端创建对象时只需要调用工厂类提供的创建方法,传入特定参数即可,而不需要记住复杂的类名,也不用关注实现的过程。(实现了封装和部分解耦)  

【缺点】:实例化对象的逻辑全部封装在一个工厂类里,每次需求变化都要单独修改工厂类(违反了开闭原则),而且出了异常可能没法正常工作。每次新增一个产品,就要创建一个新的产品类,以及修改工厂类的创建逻辑。

【应用场景】:适合业务简单或者产品较少的情况。


文章转载自二进制人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论