工厂方法模式

工厂方法模式
该模式又简称为工厂模式,定义一个用于创建对象的接口,让子类决定让哪一个类实例化,这样可以让产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该确定实例化哪一个具体产品类。
这里写图片描述
Product 抽象产品,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。
ConcreteProduct 具体产品,实现了抽象产品的接口,某种类型的具体产品有专门的具体工厂负责创建,具体工厂和具体产品之间意义对应。
Factory 抽象工厂,在抽象工厂类中声明了工厂方法,用于返回一个产品,抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
ConcreteFactory 具体工厂,是具体工厂的子类,实现了抽象工厂中定义的工厂方法,并可以由客户端调用返回一个具体的产品子类。

C++实现的工厂方法模式
AbstractFactory.h

#include <stdio.h>
#include "AbstractProduct.h"

class AbstractFactory
{
public:
    AbstractFactory();
    virtual ~AbstractFactory();
    virtual AbstractProduct * createProduct() = 0;
};

class FactoryA:public AbstractFactory
{
public:
    FactoryA();
    ~FactoryA();
    AbstractProduct * createProduct();
};

class FactoryB:public AbstractFactory
{
public:
    FactoryB();
    ~FactoryB();
    AbstractProduct * createProduct();
};

AbstractFactory.cpp

#include "AbstractFactory.h"


AbstractFactory::AbstractFactory(){}

AbstractFactory::~AbstractFactory(){}

FactoryA::FactoryA(){}

FactoryA::~FactoryA(){}

AbstractProduct * FactoryA::createProduct()
{
    AbstractProduct * temp = NULL;
    temp = new ProductA();
    return temp;
}

FactoryB::FactoryB(){}

FactoryB::~FactoryB(){}

AbstractProduct * FactoryB::createProduct()
{
    AbstractProduct * temp = NULL;
    temp = new ProductB();
    return temp;
}

AbstractProduct.h

#include <stdio.h>


class AbstractProduct
{
public:
    AbstractProduct();
    virtual ~AbstractProduct();
    virtual void operation() = 0;
};

class ProductA:public AbstractProduct
{
public:
    ProductA();
    virtual ~ProductA();
    void operation();
};

class ProductB:public AbstractProduct
{
public:
    ProductB();
    ~ProductB();
    void operation();
};

AbstractProduct.cpp

#include "AbstractProduct.h"


AbstractProduct::AbstractProduct(){}

AbstractProduct::~AbstractProduct(){}

ProductA::ProductA(){}

ProductA::~ProductA(){}

void ProductA::operation()
{
    printf("hello ProductA\n");
}

ProductB::ProductB(){}

ProductB::~ProductB(){}

void ProductB::operation()
{
    printf("hello ProductB\n");
}

client.cpp

#include "AbstractFactory.h"

int main()
{
    AbstractFactory * f_a = new FactoryA();
    AbstractProduct * p_a = f_a->createProduct();
    p_a->operation();
    delete p_a;
    p_a = NULL;
    delete f_a;
    f_a = NULL;

    AbstractFactory * f_b = new FactoryB();
    AbstractProduct * p_b = f_b->createProduct();
    p_b->operation();
    delete(p_b);
    p_b = NULL;
    delete(f_b);
    f_b = NULL;
    system("pause");
}

特点:
优缺点和简单工厂模式差不多。主要区别如下:
可以看出工厂模式就是改进了简单工厂模式中的开放-封闭原则。在简单工厂模式中每增加一个产品的时候就需要修改条件分支增加一个判断,违背了开放-封闭原则。而工厂模式每次添加产品子类的时候,只需再添加一个工厂子类就可以了。

由于在该模式中每个工厂类只生产一类产品,可能会导致系统中在大量的工厂类,因此考虑相关产品形成一个产品簇,由同一类工厂来实现,这就是抽象工厂模式,见下一篇。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值