简单工厂模式(Simple Factory) vs 工厂方法模式(Factory Method)

来源:互联网 发布:将java类传到jsp里面 编辑:程序博客网 时间:2024/05/22 17:51

写在前面: 简单工厂模式和方法模式是设计模式中两种比较简单,同时也是比较常用的模式,本文的主要任务就是通过循序渐进的方法,从根本上掌握这两种设计模式。最后再通过对比两种模式的不同之处,更进一点加深对它们的掌握。

一.简单工厂模式(Simaple Factory)


在简单工厂模式中的各个角色:

Creator: 它的角色就是工厂,负责生产各种产品

Product: 它的角色是产品,是对所有产品的一个统称。在实现过程中,它是具体产品的公共基类。

ConcreteProduct: 它的角色是具体产品,它是每一种产品的具体实现。

下面附一个例子:Creator为CarFactory, Product为Car, ConcreteCar为BenzCar和BmwCar,因程序比较简单,这里不再做介绍。

#include <iostream>#include <string> using namespace std; class Car{public:    virtual void Drive() const = 0;}; class BenzCar : public Car{public:    void Drive() const    {        cout << "Drive Benz Car" << endl;    }}; class BmwCar : public Car{public:    void Drive() const    {        cout << "Drive Bmw Car" << endl;    }}; class CarFactory{public:    static Car * CreateCar(const string & strCarName)    {        if (strCarName == "Benz")        {            return new BenzCar();        }        else if (strCarName == "Bmw")        {            return new BmwCar();        }        else        {            cout << "Invalid Car" << endl;            return NULL;        }    }    static void DestroyCar(Car * pCar)    {        delete pCar;    }}; int main(){    Car * pCar = CarFactory::CreateCar("Benz");    if (NULL != pCar)    {        pCar->Drive();    }    CarFactory::DestroyCar(pCar);}


二.工厂方法模式(Factory Method)

在工厂方法中的各个角色:

1.Creator: 工厂的统称,在具体的实现中,它是所有具体做事情的工厂的基类,它只做所有工厂都要做的共同的事情,其它的事情由各个具体的工厂去做。

2.ConcreteCreator:具体的工厂,具体负责生产某一类产品

3.Product:产品的统称,在具体的实现中,它是所有产品的基类,它实现所有产品都共有的特性。

4.ConcreteProduct: 具体的产品,它是用来实现某种产品的具体的类。

下面附上一个例子,Creator为CarFactory, ConcreteCreator为BenzFactory和BmwFactory, Product为Car, ConcreteProduct为BenzCar和BmwCar,因程序比较简单,这里不再做介绍。

#include <iostream> using namespace std; class Car{public:    virtual void Drive() const = 0;}; class BenzCar : public Car{public:    void Drive() const    {        cout << "Drive Benz Car" << endl;    }}; class BmwCar : public Car{public:    void Drive() const    {        cout << "Drive Bmw Car" << endl;    }}; class CarFactory{public:    virtual Car * CreateCar() = 0;    virtual void DestroyCar(Car * pCar)    {        delete pCar;    }}; class BenzFactory : public CarFactory{public:    Car * CreateCar()    {        return new BenzCar();    }}; class BmwFactory : public CarFactory{    Car * CreateCar()    {        return new BmwCar();    }}; int main(){    CarFactory * pCarFactory = new BenzFactory();    Car * pCar = pCarFactory->CreateCar();    pCar->Drive();    pCarFactory->DestroyCar(pCar);    delete pCarFactory;}


三.简单工厂模式和工厂方法模式的对比:

1. 关于扩展:

简单工厂模式把变化集中到工厂中,每次新加一种品种,就要在工厂方法中做相应的修改;

工厂方法模式,每次新加一个产品,只需要在实现产品的同时,实现该产品对应的具体工厂。它的优点是扩展的时候,不需要修改以前代码,只需增加 新的代码。

2.关于使用:

简单工厂模式,每次要使用的时候,必需要知道事先约定好的,区别每个产品的标志符。

工厂方法模式,每次要生产某个产品时,必需要知道其所对应的具体工厂。

总的来说,我认为工厂方法模式的在扩展性方面略优于简单工厂模式,所以在这两个里面选的话,我优先会考虑工厂方法模式。尤其在系统比较复杂,要生产的产品比较多的时候,工厂方法模式的优点会更加突出。