工厂方法模式
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
其实也可以写一个函数,用字符串的方式制定需要创建的工厂,再返回创建的具体工厂。
以上是关于工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章