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