设计模式工厂方法(FactoryMethod)

工厂方法:

优点:

基本与简单工厂一致,但是遵循封闭-开放原则,灵活性更强

缺点:

与简单工厂差不多


代码实现:

FactoryMethod.h

#ifndef FACTORYMETHOD_H
#define FACTORYMETHOD_H

namespace FactoryMethod {

/*Product*/
class AbstrcutBase
{
public:
    AbstrcutBase(){}
    ~AbstrcutBase(){}
    virtual void show();
};

class ProductA : public AbstrcutBase
{
public:
    ProductA(){}
    ~ProductA(){}
    void show();
};

class ProductB : public AbstrcutBase
{
public:
    ProductB(){}
    ~ProductB(){}
    void show();
};

/*Factory*/
class FactoryBase
{
public:
    FactoryBase(){}
    ~FactoryBase(){}
    virtual AbstrcutBase *createFactory();
};

class FactoryA : public FactoryBase
{
public:
    FactoryA(){}
    ~FactoryA(){}
    AbstrcutBase *createFactory();
};

class FactoryB : public FactoryBase
{
public:
    FactoryB(){}
    ~FactoryB(){}
    AbstrcutBase *createFactory();
};
}

#endif // FACTORYMETHOD_H


FactoryMethod.cpp

#include "factorymethod.h"

#include <iostream>

void FactoryMethod::AbstrcutBase::show()
{
    std::cout << "this is AbstructBase" <<std::endl;
}

void FactoryMethod::ProductA::show()
{
    std::cout << "this is ProductA" <<std::endl;
}

void FactoryMethod::ProductB::show()
{
    std::cout << "this is ProductB" <<std::endl;
}

FactoryMethod::AbstrcutBase *FactoryMethod::FactoryBase::createFactory()
{
    std::cout << "this is AbstructFactoryBase" <<std::endl;
    return new AbstrcutBase;
}

FactoryMethod::AbstrcutBase *FactoryMethod::FactoryA::createFactory()
{
    std::cout << "this is FactoryA" <<std::endl;
    return new ProductA;
}

FactoryMethod::AbstrcutBase *FactoryMethod::FactoryB::createFactory()
{
    std::cout << "this is FactoryB" <<std::endl;
    return new ProductB;
}


main.cpp

#include <iostream>
#include "factorymethod.h"

int main()
{
    FactoryMethod::FactoryBase *factory = new FactoryMethod::FactoryBase;
    factory->createFactory()->show();


    factory = new FactoryMethod::FactoryA;
    factory->createFactory()->show();

    factory = new FactoryMethod::FactoryB;
    factory->createFactory()->show();

    return 0;
}<strong>
</strong>


你可能感兴趣的:(工厂方法)