工厂模式有三种:
- 简单工厂模式:定义一个工厂类,根据传入的参数决定创建哪种类型的对象。主要角色:
- 工厂
- 抽象产品
- 具体产品
- 工厂方法模式:定义一个创建对象的接口,但由子类实现这个接口以创建具体的对象。工厂模式使对象的创建过程延迟到子类。
- 抽象工厂:单个产品的创建
- 具体工厂
- 抽象产品
- 具体产品
- 抽象工厂模式:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。
- 抽象工厂:一组相关产品的创建
- 具体工厂
- 抽象产品
- 具体产品
其中简单工厂模式不属于23种设计模式,实例如下:
#include <iostream>
using namespace std;
/*
* 不符合开闭原则,不是23种标准的设计模式
* */
class Fruit {
public:
virtual ~Fruit() {}
virtual void sayName() = 0;
};
class Banana: public Fruit {
public:
virtual void sayName() {
cout << "Banana" << endl;
}
};
class Apple: public Fruit {
public:
virtual void sayName() {
cout << "Apple" << endl;
}
};
class Factory {
public:
Fruit* create(char* p) {
if (strcmp(p, "banana")) {
return new Banana;
} else if (strcmp(p, "apple")) {
return new Apple;
} else {
return NULL;
}
}
};
int main() {
Factory* fac = new Factory;
Fruit* banana = fac->create("banana");
banana->sayName();
delete banana;
Fruit* apple = fac->create("apple");
apple->sayName();
delete apple;
delete fac;
return 0;
}
工厂方法模式如下:
#include <iostream>
/*
* 符合开闭原则,添加新的产品不需要修改原有的代码,只需要添加新的代码
* 添加一种新的水果只需要添加一个水果类,然后添加一种新的工厂即可
* */
using namespace std;
class Fruit {
public:
virtual ~Fruit() {}
virtual void sayName() = 0;
};
class Banana: public Fruit {
public:
virtual void sayName() {
cout << "Banana" << endl;
}
};
class Apple: public Fruit {
public:
virtual void sayName() {
cout << "Apple" << endl;
}
};
class Factory {
public:
virtual ~Factory() {}
virtual Fruit* create() = 0;
};
class BananaFactory: public Factory {
public:
Fruit* create() {
return new Banana;
}
};
class AppleFactory: public Factory {
public:
Fruit* create() {
return new Apple;
}
};
int main() {
Factory* fac = NULL;
Fruit* fruit = NULL;
fac = new BananaFactory;
fruit = fac->create();
fruit->sayName();
delete fruit;
delete fac;
fac = new AppleFactory;
fruit = fac->create();
fruit->sayName();
delete fruit;
delete fac;
return 0;
}
创建模式(5种)
结构模式(7种)
行为模式(11种)