1.简单描述
工厂模式用来创建具体类的对象。普通的工厂模式分为两个部分:一是具体的产品类,他们都继承自一个最初的抽象类;二是工厂,工厂也可以分为不同类型,也都继承于同一个接口工厂。不同类型的工场可以生产不同大类的产品,同一个类型的工厂中可以生产同一大类不同小类的产品(相当于两级的架构),工厂会输出最终的产品,而产品的内部成员的创建由产品类自己负责。
2.类图
。。。。。。。。。。。。待补
3.实例程序
3.1 产品定义
//product.h
#ifndef Product_H
#define Product_H
//all kinds of product derived from interface Product
class Product
{
public:
Product(){};
virtual ~Product(){};
virtual void printProductName() = 0;
};
class StoreAProductA: public Product
{
public:
StoreAProductA(){};
~StoreAProductA(){};
virtual void printProductName();
private:
int m_productMember;
};
class StoreAProductB: public Product
{
public:
StoreAProductB(){};
~StoreAProductB(){};
virtual void printProductName();
private:
int m_productMember;
};
class StoreBProductA: public Product
{
public:
StoreBProductA(){};
~StoreBProductA(){};
virtual void printProductName();
private:
int m_productMember;
};
class StoreBProductB: public Product
{
public:
StoreBProductB(){};
~StoreBProductB(){};
virtual void printProductName();
private:
int m_productMember;
};
#endif
//product.cpp
#include <iostream>
#include "product.h"
using namespace std;
void StoreAProductA::printProductName()
{
cout<<"StoreAProductA"<<endl;
}
void StoreAProductB::printProductName()
{
cout<<"StoreAProductB"<<endl;
}
void StoreBProductA::printProductName()
{
cout<<"StoreBProductA"<<endl;
}
void StoreBProductB::printProductName()
{
cout<<"StoreBProductB"<<endl;
}
3.2 工厂定义
//Factory.h
#ifndef ProductStore_H
#define ProductStore_H
// all kinds of ProductStore(factory) derived from ProductStore
class Product;
class ProductStore
{
public:
ProductStore(){};
virtual ~ProductStore(){};
virtual Product* createProduct(char productName) = 0;
};
class ProductStoreA: public ProductStore
{
public:
ProductStoreA(){};
~ProductStoreA(){};
virtual Product* createProduct(char productName);
};
class ProductStoreB: public ProductStore
{
public:
ProductStoreB(){};
~ProductStoreB(){};
virtual Product* createProduct(char productName);
};
#endif
//Factory.cpp
#include <iostream>
#include "product.h"
#include "productStore.h"
using namespace std;
Product* ProductStoreA:: createProduct(char productName)
{
switch(productName)
{
case 'A':
return new StoreAProductA();
break;
case 'B':
return new StoreAProductB();
break;
default:
return NULL;
break;
}
}
Product* ProductStoreB:: createProduct(char productName)
{
switch(productName)
{
case 'A':
return new StoreBProductA();
break;
case 'B':
return new StoreBProductB();
break;
default:
return NULL;
break;
}
}
3.3测试代码
//test.cpp
#include <iostream>
#include "product.h"
#include "productStore.h"
using namespace std;
int main(int argc, char const *argv[])
{
/* code */
ProductStore* store1 = new ProductStoreA();
// should chang raw pointer to smart pointer
Product* product1 = store1->createProduct('A');
if (NULL != product1)
{
product1->printProductName();
delete product1;
product1 = NULL;
}
Product* product2 = store1->createProduct('A');
if (NULL != product2)
{
product2->printProductName();
delete product2;
product2 = NULL;
}
if (NULL != store1)
{
delete store1;
store1 = NULL;
}
ProductStore* store2 = new ProductStoreB();
// should chang raw pointer to smart pointer
Product* product3 = store2->createProduct('A');
if (NULL != product3)
{
product3->printProductName();
delete product3;
product3 = NULL;
}
Product* product4 = store2->createProduct('A');
if (NULL != product4)
{
product4->printProductName();
delete product4;
product4 = NULL;
}
if (NULL != store2)
{
delete store2;
store2 = NULL;
}
return 0;
}