工厂模式

来源:互联网 发布:零基础学sql视频教程 编辑:程序博客网 时间:2024/06/06 02:45

工厂模式

工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。
工程模式具体上分为三类:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

简单工厂模式

简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。有点抽象,举个例子就明白了。有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核。客户需要什么样的处理器核,一定要显示地告诉生产工厂。

UML类图

简单工厂模式

试用场景:

  • 在程序中,需要创建的对象很多,导致对象的new操作多且杂时,需要使用简单工厂模式。
  • 由于对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方便后期的程序扩展和维护。

局限性:

若要添加新产品的时候,首先要在产品类型中添加新产品标识,然后还要在工厂类中的的switch()函数,对原代码的改动量较大,容易产生编码的错误,从本质上不能称之为对代码的扩展。

Code

typedef enum ProductTypeTag{    TypeA,    TypeB,    TypeC}PRODUCTTYPE;class Product{public:    virtual void Show() = 0;};class ProductA : public Product{public:    void Show()    {        cout<<"I'm ProductA"<<endl;    }};class ProductB : public Product{public:    void Show()    {        cout<<"I'm ProductB"<<endl;    }};class ProductC : public Product{public:    void Show()    {        cout<<"I'm ProductC"<<endl;    }};// Here is the Factory classclass Factory{public:    Product* CreateProduct(PRODUCTTYPE type)    {        switch (type)        {        case TypeA:            return new ProductA();        case TypeB:            return new ProductB();        case TypeC:            return new ProductC();        default:            return NULL;        }    }};

工厂方法模式

工厂方法模式是在简单工厂模式的基础上,对“工厂”添加了一个抽象层。将工厂共同的动作抽象出来,作为抽象类,而具体的行为由子类本身去实现,让子类去决定生产什么样的产品。

UML类图:

工厂方法模式

试用场景:

工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

  • 在设计的初期,就考虑到产品在后期会进行扩展的情况下,可以使用工厂方法模式。
  • 产品结构较复杂的情况下,可以使用工厂方法模式。
  • 工厂方法模式适用于产品种类结构单一的场合,为一类产品提供创建的接口。

局限性

  • 当产品的数量增加,工厂的数量也会变的很多,工厂变得凌乱难以管理。
  • 当工厂需要生成一种全新的产品的时候,由于所有的产品都继承与Product,此时工厂心有余而力不足。

Code

class Product{public:    virtual void Show() = 0;};class ProductA : public Product{public:    void Show()    {        cout<< "I'm ProductA"<<endl;    }};class ProductB : public Product{public:    void Show()    {        cout<< "I'm ProductB"<<endl;    }};class Factory{public:    virtual Product *CreateProduct() = 0;};class FactoryA : public Factory{public:    Product *CreateProduct()    {        return new ProductA ();    }};class FactoryB : public Factory{public:    Product *CreateProduct()    {        return new ProductB ();    }};

抽象工厂模式

抽象工厂模式,就是工厂方法模式的扩展和延伸,但是抽象工厂模式,更有一般性和代表性;它具有工厂方法具有的优点,也增加了解决实际问题的能力。

UML类图

这里写图片描述

试用场景

抽象工厂创建的是一系列相关的对象,其中创建的实现其实就是采用的工厂方法模式。在工厂Factory中的每一个方法,就好比是一条生产线,而生产线实际需要生产什么样的产品,这是由Factory1和Factory2去决定的,这样便延迟了具体子类的实例化;同时集中化了生产线的管理,节省了资源的浪费。
而抽象工厂方法适用于产品种类结构多的场合,主要用于创建一组(有多个种类)相关的产品,为它们提供创建的接口;就是当具有多个抽象角色时,抽象工厂便可以派上用场。

Code

class ProductA{public:    virtual void Show() = 0;};class ProductA1 : public ProductA{public:    void Show()    {        cout<<"I'm ProductA1"<<endl;    }};class ProductA2 : public ProductA{public:    void Show()    {        cout<<"I'm ProductA2"<<endl;    }};// Product Bclass ProductB{public:    virtual void Show() = 0;};class ProductB1 : public ProductB{public:    void Show()    {        cout<<"I'm ProductB1"<<endl;    }};class ProductB2 : public ProductB{public:    void Show()    {        cout<<"I'm ProductB2"<<endl;    }};// Factoryclass Factory{public:    virtual ProductA *CreateProductA() = 0;    virtual ProductB *CreateProductB() = 0;};class Factory1 : public Factory{public:    ProductA *CreateProductA()    {        return new ProductA1();    }    ProductB *CreateProductB()    {        return new ProductB1();    }};class Factory2 : public Factory{    ProductA *CreateProductA()    {        return new ProductA2();    }    ProductB *CreateProductB()    {        return new ProductB2();    }};
1 0
原创粉丝点击