设计模式 - Factory工厂模式

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值