一、工厂模式
1. 简单工厂
不符合开闭原则,故不在23种设计模式中
class Fruit {
public:
virtual ~Fruit() = default;
virtual void Process() = 0;
};
class Apple : public Fruit{
public:
void Process() override {
cout << "apple" << endl;
}
};
class Banana : public Fruit{
public:
void Process() override {
cout << "banana" << endl;
}
};
class Factory {
public:
Fruit* Create(const char * fruit) {
if (strcmp(fruit, "apple") == 0) { // 不符合开闭原则,新增产品需要修改此处的代码
return new Apple;
} else {
return new Banana;
}
}
};
int main() {
Factory* factory = new Factory;
auto apple = factory->Create("apple");
apple->Process();
delete apple;
delete factory;
}
2. 工厂方法
class Fruit {
public:
virtual ~Fruit() = default;
virtual void Process() = 0;
};
class Apple : public Fruit{
public:
void Process() override {
cout << "apple" << endl;
}
};
class Banana : public Fruit{
public:
void Process() override {
cout << "banana" << endl;
}
};
class Factory {
public:
virtual ~Factory() = default;
virtual Fruit* Create() = 0;
};
class AppleFctory : public Factory{ // 可进行扩展
Fruit * Create() override {
return new Apple;
}
};
int main() {
Factory* factory = new AppleFctory;
auto apple = factory->Create();
apple->Process();
delete apple;
delete factory;
}
3. 抽象工厂
class Product {
public:
virtual ~Product() = default;
virtual void Show() = 0;
};
// 鼠标
class Mouse: public Product{};
class LogiMouse : public Mouse {
void Show() override {
cout << "罗技 Mouse";
}
};
class RazerMouse : public Mouse {
void Show() override {
cout << "雷蛇 Mouse";
}
};
// 键盘
class Keyboard : public Product{};
class LogiKeyboard : public Keyboard {
void Show() override {
cout << "罗技 Keyboard";
}
};
class RazerKeyboard : public Keyboard {
void Show() override {
cout << "雷蛇 Keyboard";
}
};
// 抽象工厂
class Factory {
public:
virtual ~Factory() = default;
virtual Mouse* CreateMouse() = 0;
virtual Keyboard* CreateKeyBoard() = 0; //若再增加产品不符合开闭原则
};
class LogiFactory : public Factory {
Mouse * CreateMouse() override{
return new LogiMouse;
}
Keyboard * CreateKeyBoard() override {
return new LogiKeyboard;
}
};
class RazerFactor :public Factory {
Mouse * CreateMouse() override{
return new RazerMouse;
}
Keyboard * CreateKeyBoard() override {
return new RazerKeyboard;
}
};
int main() {
Factory* factory = new LogiFactory;
Mouse* logiMouse = factory->CreateMouse();
Keyboard* logiKeyboard = factory->CreateKeyBoard();
logiMouse->Show();
logiKeyboard->Show();
delete logiKeyboard;
delete logiMouse;
delete factory;
logiMouse = nullptr;
logiKeyboard = nullptr;
factory = nullptr;
}