工厂方法模式是在简单工厂模式的缺点上进行优化的,我们都知道,在简单工厂模式中,要去增加或者减少一个产品的类型,都需要修改工厂中的if-else判断。这样子显然不符合我们代码开发中的开闭原则,拓展起来也是非常麻烦的
工厂方法模式 = 简单工厂模式 + “开闭原则”
定义思想:工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的就是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类
系统中的类是成对增加,增加了系统的复杂度和理解度
适用场景:
代码实现:(手机产品)
//抽象手机 class AbstractPhone { public: virtual void ShowName() = 0; }; //华为 class Huawei : public AbstractPhone { public: virtual void ShowName() { cout << "Huawei Phone" << endl; } }; //小米 class Xiaomi : public AbstractPhone { public: virtual void ShowName() { cout << "Xiaomi Phone" << endl; } }; //苹果 class Apple : public AbstractPhone { public: virtual void ShowName() { cout << "Apple Phone" << endl; } }; //抽象工厂 class AbstractPhoneFactory { public: virtual AbstractPhone* CreatePhone() = 0; }; //华为工厂 class HuaweiFactory : public AbstractPhoneFactory { public: virtual AbstractPhone* CreatePhone() { return new Huawei(); } }; //小米工厂 class XiaomiFactory : public AbstractPhoneFactory { public: virtual AbstractPhone* CreatePhone() { return new Xiaomi(); } }; //苹果工厂 class AppleFactory : public AbstractPhoneFactory { public: virtual AbstractPhone* CreatePhone() { return new Apple(); } };
测试:
void test() { //创建一个工厂 AbstractPhoneFactory* factory = nullptr; //创建一个手机 AbstractPhone* phone = nullptr; //指定工厂是华为工厂 factory = new HuaweiFactory; //通过华为工厂创建一个手机 phone = factory->CreatePhone(); phone->ShowName(); delete phone; delete factory; factory = new XiaomiFactory; phone = factory->CreatePhone(); phone->ShowName(); delete phone; delete factory; factory = new AppleFactory; phone = factory->CreatePhone(); phone->ShowName(); delete phone; delete factory; }
运行结果: