工厂模式和简单工厂模式比较:
UML图:
简单的工厂模式 图示:
此时,如果我想增加一种水果,石榴,那么我的水果种植基地就需要扩展一块石榴园的种植土地。那么就不符合设计原则中的开闭原则,因此它不属于23种设计模式。
扩展图示:
工厂模式图示
此时,如果想增加一种水果,那么不需要改变原来的水果基地,直接再开辟一块地来种植新的水果,如下图:
简单工厂模式的简单代码:simple_factory.h
#ifndef SIMPLE_FACTORY_H
#define SIMPLE_FACTORY_H
#include <iostream>
#include <string.h>
using namespace std;
class Fruit {
public:
virtual void fruitName() = 0;
};
class Banana : public Fruit {
public:
void fruitName() {
cout << "I'm Banana" <<endl;
}
};
class Apple : public Fruit {
public:
void fruitName() {
cout << "I'm Apple" <<endl;
}
};
class Pineapple : public Fruit {
public:
void fruitName() {
cout << "I'm Pineapple" <<endl;
}
};
class Watermelon : public Fruit {
public:
void fruitName() {
cout << "I'm Watermelon" <<endl;
}
};
class Peach : public Fruit {
public:
void fruitName() {
cout << "I'm Peach" <<endl;
}
};
class Factory {
public:
Fruit * createProduct(const char *chType) {
if(strcmp(chType , "Banana") == 0)
{
return new Banana;
}
else if (strcmp(chType , "Apple") == 0)
{
return new Apple;
}
else if (strcmp(chType , "Pineapple") == 0)
{
return new Pineapple;
}
else if (strcmp(chType , "Watermelon") == 0)
{
return new Watermelon;
}
else if (strcmp(chType , "Peach") == 0)
{
return new Peach;
}
else
{
return nullptr;
}
}
};
#endif // SIMPLE_FACTORY_H
工厂模式代码:factory_mode.h
#ifndef FACTORY_MODE_H
#define FACTORY_MODE_H
#include <iostream>
#include <string.h>
using namespace std;
class Fruit {
public:
virtual void fruitName() = 0;
};
class Banana : public Fruit {
public:
void fruitName() {
cout << "I'm Banana" <<endl;
}
};
class Apple : public Fruit {
public:
void fruitName() {
cout << "I'm Apple" <<endl;
}
};
class Pineapple : public Fruit {
public:
void fruitName() {
cout << "I'm Pineapple" <<endl;
}
};
class Watermelon : public Fruit {
public:
void fruitName() {
cout << "I'm Watermelon" <<endl;
}
};
class Peach : public Fruit {
public:
void fruitName() {
cout << "I'm Peach" <<endl;
}
};
class Factory {
public:
virtual Fruit * createProduct() =0 ;
};
class BananaFactor : public Factory {
public:
Fruit * createProduct() {
return new Banana;
}
};
class AppleFactor : public Factory {
public:
Fruit * createProduct() {
return new Apple;
}
};
class PineappleFactor : public Factory {
public:
Fruit * createProduct() {
return new Pineapple;
}
};
class WatermelonFactor : public Factory {
public:
Fruit * createProduct() {
return new Watermelon;
}
};
class PeachFactor : public Factory {
public:
Fruit * createProduct() {
return new Peach;
}
};
#endif // FACTORY_MODE_H
统一调用代码:main.cpp
#define FACTORY_MODE
#ifdef SIMPLE_FACTORY
#include "simple_factory.h"
#endif
#ifdef FACTORY_MODE
#include "factory_mode.h"
#endif
int main(int argc, char *argv[])
{
#ifdef SIMPLE_FACTORY
Factory *fa = new Factory;
Fruit *fr = nullptr;
//生产香蕉
fr = fa->createProduct("Banana");
fr->fruitName();
delete fr;
fr = nullptr;
//生产苹果
fr = fa->createProduct("Apple");
fr->fruitName();
delete fr;
fr = nullptr;
//生产西瓜
fr = fa->createProduct("Watermelon");
fr->fruitName();
delete fr;
fr = nullptr;
#endif
#ifdef FACTORY_MODE
Factory *fa = nullptr;
Fruit *fr = nullptr;
//生产桃子
fa = new PeachFactor;
fr = fa->createProduct();
fr->fruitName();
delete fa;
fa = nullptr;
delete fr;
fr = nullptr;
//生产菠萝
fa = new PineappleFactor;
fr = fa->createProduct();
fr->fruitName();
delete fa;
fa = nullptr;
delete fr;
fr = nullptr;
#endif
return 0;
}