工厂方法模式

Posted 顾文繁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂方法模式相关的知识,希望对你有一定的参考价值。

简单工厂方法所有的产品都是由一个工厂创建,工厂指责较重,业务逻辑复杂,具体产品和工厂类的耦合度较高,严重影响了系统的灵活性和扩展性,使用工厂方法可以很好的解决这个问题。

我们使用包含如下角色:

1 Factory(工厂角色)

2 Product (抽象产品角色)

3 ConcreteProduct(具体产品角色)

1 ConcreteFactory(具体工厂)

该模式不属于GOF 23个基本设计模式。

下面使用工厂方法模式进行生产电视,一共涉及到两个抽象类:AbstractTV和AbstractFactory

具体TV实现AbstractTV,具体制造TV工厂实现AbstractFactory。

AbstractTV.h

#ifndef PATTERN_DESIGN_ABSTRACTTV_H
#define PATTERN_DESIGN_ABSTRACTTV_H

class AbstractTV{
public:
    virtual void show() = 0;
};

#endif //PATTERN_DESIGN_ABSTRACTTV_H

AppleTV.h

#ifndef PATTERN_DESIGN_HAIERTV_H
#define PATTERN_DESIGN_HAIERTV_H
#include "AbstractTV.h"
#include <iostream>

using namespace std;

class AppleTV : public AbstractTV{
public:
    virtual void show(){
        cout << "This is AppleTV." << endl;
    }
};

#endif //PATTERN_DESIGN_HAIERTV_H

HaierTV.h

#ifndef PATTERN_DESIGN_HAIERTV_H
#define PATTERN_DESIGN_HAIERTV_H
#include "AbstractTV.h"
#include <iostream>

using namespace std;

class HaierTV : public AbstractTV{
public:
    virtual void show(){
        cout << "This is HaierTV." << endl;
    }
};

#endif //PATTERN_DESIGN_HAIERTV_H

 

TVFactory.h
#ifndef PATTERN_DESIGN_TVFACTORY_H
#define PATTERN_DESIGN_TVFACTORY_H
#include "AppleTV.h"
#include "HaierTV.h"
#include "AbstractTV.h"

class TVFactory{
public:
    virtual AbstractTV* createTV() = 0;
};

#endif //PATTERN_DESIGN_TVFACTORY_H
AppleTVFactory.h
#ifndef PATTERN_DESIGN_HAIERTVFACTORY_H
#define PATTERN_DESIGN_HAIERTVFACTORY_H
#include "TVFactory.h"
#include "AppleTV.h"

class AppleTVFactory : public TVFactory{
public:
    virtual AbstractTV* createTV(){
        return new AppleTV;
    }
};

#endif //PATTERN_DESIGN_HAIERTVFACTORY_H

 

HaierTVFactory.h
#ifndef PATTERN_DESIGN_HAIERTVFACTORY_H
#define PATTERN_DESIGN_HAIERTVFACTORY_H
#include "TVFactory.h"
#include "HaierTV.h"

class HaierTVFactory : public TVFactory{
public:
    virtual AbstractTV* createTV(){
        return new HaierTV;
    }
};

#endif //PATTERN_DESIGN_HAIERTVFACTORY_H

 

测试代码:

#ifndef PATTERN_DESIGN_TEST_FACTORY_H
#define PATTERN_DESIGN_TEST_FACTORY_H
#include "TVFactory.h"
#include "AppleTVFactory.h"

void test_simple_factory(){
    TVFactory* tvFactory = new AppleTVFactory;
    AbstractTV* tv = tvFactory->createTV();
    tv->show();
}

#endif //PATTERN_DESIGN_TEST_FACTORY_H

其实也可以写一个函数,用字符串的方式制定需要创建的工厂,再返回创建的具体工厂。

 

 

 

 

以上是关于工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-简单工厂工厂方法模式抽象工厂模式详解

工厂方法模式

设计模式-工厂方法模式(Go实现)

C++工厂模式(简单工厂工厂方法抽象工厂)

C++工厂模式(简单工厂工厂方法抽象工厂)

设计模式---工厂模式