学习过简单工厂模式,感觉很好用。在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码。大大的减少了代码修改的难度。而且可以通过参数不同,创建不同的对象。
但是简单工厂模式也有一些弊端,违背了开放--封闭原则。即如果我们增加了一个产品,对应的工厂也要进行修改,即switch---case中要新增加一些分支条件,不利于扩展。所以就有了下面的工厂方法模式:
工厂方法模式:定义了一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到子类。
// 设计模式Demo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string> using namespace std; //被创建的对象基类动物类 class Animal { public: virtual void func() = 0; }; //子类 鸟 class Bird : public Animal { public: void func()override { cout<<"I am a bird. I can fly!"<<endl; } }; //子类 人 class Human : public Animal { public: void func()override { cout<<"I am a human. I can walk!"<<endl; } }; //工厂基类 class FactoryMethod { public: virtual Animal* Create() = 0; }; //人类工厂 class HumanFactory : public FactoryMethod { public: Animal* Create()override { return new Human(); } }; //鸟类工厂 class BirdFactory : public FactoryMethod { public: Animal* Create()override { return new Bird(); } }; int _tmain(int argc, _TCHAR* argv[]) { //创建一个人类工厂 FactoryMethod* god = new HumanFactory(); //生成人类对象,并执行操作 god->Create()->func(); //创建一个鸟类工厂 god = new BirdFactory(); //生成鸟类对象,并执行操作 god->Create()->func(); getchar(); return 0; }<strong> </strong>
结果:
I am a human. I can walk!
I am a bird. I can fly!
使用工厂方法模式时,我们定义工厂方法时,只要定义一个接口或者抽象类,子类继承该接口或者抽象类,具体实现都由子类实现。而且不像简单工厂模式那样,需要在工厂中增加判断条件,在这里,添加子类的生产方法,只需要从接口或者抽象类再派生一个相关的子工厂类。遵循开放--封闭式原则。
原文地址:http://blog.csdn.net/puppet_master/article/details/46404547