设计模式之工厂模式

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。

1、简单工厂模式

该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,其UML类图如下:


简单工厂

下面通过手机生产来了解简单工厂模式:

  • Phone:抽象手机类(AbstractPhone)
  • HUAWEI:制造华为手机(HuaweiPhone)
  • iPhone:制造苹果手机(iPhone)
  • PhoneFactory:手机制造工厂(PhoneFactory)

简要的代码:

enum PTYPE {HUAWEI, IPHONE};
// 抽象类
class AbstractPhone
{
public:
    virtual void make() = 0;
};
// 华为手机
class HuaweiPhone : public AbstractPhone
{
public:
    void make() { cout << "Make HUAWEI Phone!" <<endl; }
};
// 苹果手机
class iPhone : public AbstractPhone
{
public:
    void make() { cout << "Make iPhone!" <<endl; }
};
// 唯一的工厂,可以生产两种手机,在内部判断
class PhoneFactory
{
public:
    AbstractPhone* makePhone(enum PTYPE ptype)
    {
        if (ptype == HUAWEI)
        {
            return new HuaweiPhone (); // 生产华为手机
        }
        else if (ptype == IPHONE)
        {
            return new iPhone (); // 生产苹果手机
        }
        else
        {
            return NULL;
        }
    }
};

这样设计的主要缺点是,在增加新的手机类型时,需要修改工厂类来满足需求。这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。

2、工厂方法模式

和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,其UML类图如下:


工厂方法

也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。

继续通过手机生产来了解工厂方法模式:

  • Phone:抽象手机类(AbstractPhone)
  • HUAWEI:制造华为手机(HuaweiPhone)
  • iPhone:制造苹果手机(ApplePhone)
  • Factory:抽象工厂类(AbstractFactory)
  • HUAWEIFactory:华为手机工厂(HUAWEIFactory)
  • AppleFactory:苹果手机工厂(AppleFactory)

简要的代码:

// 抽象手机类
class AbstractPhone
{
public:
    virtual void make() = 0;
};
// 华为手机
class HuaweiPhone : public AbstractPhone
{
public:
    void make() { cout << "Make HUAWEI phone!" << endl; }
};
// 苹果手机
class ApplePhone : public AbstractPhone
{
public:
    void make() { cout << "Make iPhone!" <<endl; }
};
// 抽象工厂类
class AbstractFactory
{
public:
    virtual AbstractPhone* MakePhone() = 0;
};
// 生产华为手机的工厂
class HUAWEIFactory : public AbstractFactory
{
public:
    HuaweiPhone* MakePhone()
    {
        return new HuaweiPhone;
    }
};
// 生产苹果手机的工厂
class AppleFactory : public AbstractFactory
{
public:
    ApplePhone* MakePhone()
    {
        return new ApplePhone;
    }
};

工厂方法模式也有缺点,每增加一种产品,就需要增加一个对象的工厂。如果这家公司发展迅速,需要生产Pad,那么就要开设相应的新工厂。

3、抽象工厂

既然有了简单工厂模式和工厂方法模式,为什么还要有抽象工厂模式呢?它到底有什么作用呢?这家公司的技术不断进步,不仅可以生产Phone,也能生产Pad。现在简单工厂模式和工厂方法模式都鞭长莫及。抽象工厂模式登场了。它的定义为提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。其UML类图如下:

抽象工厂

我们继续通过华为和苹果产品生产来了解抽象工厂模式:

  • Phone:抽象手机类(AbstractPhone)
  • HUAWEI:制造华为手机(HuaweiPhone)
  • iPhone:制造苹果手机(ApplePhone)
  • Pad:抽象平板类(AbstractPad)
  • HUAWEI Pad:制造华为Pad(HuaweiPad)
  • iPad:制造苹果Pad(ApplePad)
  • Factory:抽象工厂类(AbstractFactory)
  • HUAWEIFactory:华为工厂(HUAWEIFactory)
  • AppleFactory:苹果工厂(AppleFactory)

简单的代码:

// 抽象手机类
class AbstractPhone
{
public:
    virtual void make() = 0;
};
// 华为手机
class HuaweiPhone : public AbstractPhone
{
public:
    void make() { cout << "Make HUAWEI phone!" << endl; }
};
// 苹果手机
class ApplePhone : public AbstractPhone
{
public:
    void make() { cout << "Make iPhone!" << endl; }
};
// 抽象平板类
class AbstractPad
{
public:
    virtual void make() = 0;
};
// 华为平板
class HuaweiPad : public AbstractPad
{
public:
    void make() { cout << "Make HUAWEI pad!" << endl; }
};
// 苹果平板
class ApplePad : public AbstractPad
{
public:
    void make() { cout << "Make iPad!" << endl; }
};
// 抽象工厂
class AbstractFactory
{
public:
    virtual AbstractPhone* MakePhone() = 0;
    virtual AbstractPad* MakePad() = 0;
};
// 华为工厂,专门生产华为的产品
class HUAWEIFactory : public AbstractFactory
{
public:
    AbstractPhone* MakePhone()
    {
        return new HuaweiPhone();
    }

    AbstractPad* MakePad()
    {
        return new HuaweiPad();
    }
};
// 苹果工厂,专门生产苹果的产品
class AppleFactory: public AbstractFactory
{
public:
    AbstractPhone* MakePhone()
    {
        return new ApplePhone();
    }

    AbstractPad* MakePad()
    {
        return new ApplePad();
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容