C++设计模式:工厂模式

1、设计思想

我们知道,工厂可以生产产品,那么工厂到底是什么性质的厂呢,产品到底是什么类型的产品呢?

所以,这里的工厂和产品就是抽象的,可以抽象为基类,被子类继承。

//产品类
//公共属性:productName
class Product
{
public:
    Product(QString productName);
    virtual~Product()=0;
private:
    QString productName;
};
//工厂类
//公共接口:CreateProduct,生成产品
class Factory
{
public:
    Factory();
    virtual~Factory()=0;
    virtual Product *CreateProduct(QString productName)=0;
};

产品有好多种,所以就会存在不同的产品子类;工厂也是一样的。

//ProductA
//特有属性:price
class ConcreteProductA:public Product
{
public:
    ConcreteProductA(QString productName,double price);
    ~ConcreteProductA();
private:
    double price;

};

//ProductB
//特有属性:width
class ConcreteProductB:public Product
{
public:
    ConcreteProductB(QString productName,double width);
    ~ConcreteProductB();
private:
    double width;

};
//具体的工厂
//重写CreateProduct,实现自己的生产方法
class ConcreteFactory:public Factory
{
public:
    ConcreteFactory();
    ~ConcreteFactory();
    Product *CreateProduct(QString productName);
};

2、具体代码实现

factory.h:

#ifndef FACTORY_H
#define FACTORY_H

#include <QString>

//产品类
//公共属性:productName
class Product
{
public:
    Product(QString productName);
    virtual~Product()=0;
private:
    QString productName;
};

//ProductA
//特有属性:price
class ConcreteProductA:public Product
{
public:
    ConcreteProductA(QString productName,double price);
    ~ConcreteProductA();
private:
    double price;

};

//ProductB
//特有属性:width
class ConcreteProductB:public Product
{
public:
    ConcreteProductB(QString productName,double width);
    ~ConcreteProductB();
private:
    double width;

};

//工厂类
//公共接口:CreateProduct
class Factory
{
public:
    Factory();
    virtual~Factory()=0;
    virtual Product *CreateProduct(QString productName)=0;
};

//具体的工厂
//重写CreateProduct,实现自己的生产方法
class ConcreteFactory:public Factory
{
public:
    ConcreteFactory();
    ~ConcreteFactory();
    Product *CreateProduct(QString productName);
};



#endif // FACTORY_H

factory.cpp:

#include "factory.h"
#include <QDebug>

Product::Product(QString productName)
{
    this->productName=productName;
    qDebug() << "Product";
}
Product::~Product()
{

}

ConcreteProductA::ConcreteProductA(QString productName,double price):
    Product(productName)
{
    this->price=price;
   qDebug()<<"ConcreteProductA";
}
ConcreteProductA::~ConcreteProductA()
{}

ConcreteProductB::ConcreteProductB(QString productName,double width):
    Product(productName)
{
    this->width=width;
    qDebug()<<"ConcreteProductB";
}
ConcreteProductB::~ConcreteProductB()
{}

Factory::Factory()
{
    qDebug()<<"Factory";
}

Factory::~Factory()
{

}

ConcreteFactory::ConcreteFactory()
{
    qDebug()<<"ConcreteFactory";
}
ConcreteFactory::~ConcreteFactory()
{}

Product * ConcreteFactory::CreateProduct(QString productName)
{
    if("PA"== productName)
    {
        return new ConcreteProductA(productName,5);
    }
    else if("PB"== productName)
    {
        return new ConcreteProductB(productName,3.1415);
    }
    else
        return 0;
}

main.cpp:

#include<factory.h>

int main(int argc, char *argv[])
{
    Factory *fac = new ConcreteFactory();
    Product *product = 0;
    
    product = fac->CreateProduct("PA");
    delete product;

    product = fac->CreateProduct("PB");
    delete product;

    delete fac;

    return 1;
}

运行结果:

Factory

ConcreteFactory

Product

ConcreteProductA

Product

ConcreteProductB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

历史五千年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值