设计模式(二)——简单工厂模式
工厂(Factory)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
抽象产品(AbstractProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂模式所创建的具体实例对象。
优点:
1. 实现了对象创建和使用的分离。
2. 不需要记住具体类名,记住参数即可,减少使用者记忆量。
缺点:
1. 对工厂类职责过重,一旦不能工作,系统受到影响。
2. 增加系统中类的个数,复杂度和理解度增加。
3. 违反“开闭原则”,添加新产品需要修改工厂逻辑,工厂越来越复杂。
适用场景
1. 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成方法中的业务逻辑太过复杂。
2. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心
#include <iostream> using namespace std; #if 0 class Fruit { public: Fruit(string kind) { this->kind = kind; if (kind == "apple") { // 代表苹果 } if (kind == "banana") { //代表香蕉 } } void get_name() { if (this->kind == "apple") { cout << "我是苹果" << endl; } else if (this->kind == "apple") { cout << "我是香蕉" << endl; } } private: string kind;// 代表水果的种类 }; int main() { //////////////////////////////////////////////////////////////////// // main函数跟Fruit类的构造函数耦合度高,随着水果种类的增加,构造函数越来越复杂 // 为了将main函数和构造函数隔离,设计工厂模式 //////////////////////////////////////////////////////////////////// Fruit* apple = new Fruit("apple"); apple->get_name(); delete apple; system("pause"); return 0; } #endif // 简单工厂模式实现 class Fruit { public: virtual void get_name() = 0; }; class Apple :public Fruit { public: virtual void get_name() { cout << "我是苹果" << endl; } }; class Banana :public Fruit { public: virtual void get_name() { cout << "我是香蕉" << endl; } }; // 增加一个品种 Pear class Pear :public Fruit { public: virtual void get_name() { cout << "我是鸭梨" << endl; } }; // 工厂 class Factory { public: Fruit * create_fruit(string kind) { if (kind == "apple") { return new Apple; } else if (kind == "banana") { return new Banana; } // 添加一个鸭梨,修改了工厂的方法,违背了开闭原则 else if (kind == "pear") { return new Pear; } } }; int main() { // 人们是跟工厂打交道 Factory* factory = new Factory;// 创建一个工厂 Fruit* apple = factory->create_fruit("apple"); apple->get_name(); delete factory; delete apple; system("pause"); return 0; }