设计模式之对象创建型 — Factory Method 工厂方法模式

本文深入讲解了工厂方法模式,这是一种创建对象的接口技术,通过定义一个创建对象的接口,但让实现延迟到子类中。文章还探讨了该模式与抽象工厂模式之间的区别,并提供了示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模式说明(总结这个模式是什么)

factory method 模式是一种用于创建对象的接口技术。再具体的说就是给一个类写一个创建某个类的成员函数,这个类是‘工厂’,这个函数就是‘工厂方法’。不过这个类一般是抽象类。一般被创建的类(product)也是抽象的,会有多个版本的子类。工厂方法具体要创建那个product,需要也需要在子类中实现。


结构

这里写图片描述

和abstract factory 的区别

可能也很多小伙伴在看完说明后一脸懵逼。这听起来怎么像是abstract factory中的描述啊。没错,其实,这两个模式是说的一个问题,只是侧重点不同。

  • abstract factory 说的是抽线工厂技术,重点是这种‘工厂’技术!
    他的目的是通过抽象类,为客户提供创建类 统一的抽象接口
  • factory method 说的是创建类的接口技术。重点在这种类方法。
    abstract factory 只是说明了怎么来提供接口,接口的实现则需要使用factory method 模式。

总之,前者说明了怎么创建接口,后者说明了怎么实现接口


可以实现的效果

  • 为子类提供挂钩
    贴一个简单的栗子就懂啦
#include <iostream>
using namespace std;

class A
{
public:
    A(){};
    ~A(){};

    int dis()
    {
        cout << "你是谁?\n" << endl;
        factory_method();
        return 0;
    }

    virtual int factory_method()
    {
        cout << "我是A" << endl;
        return 0;
    }

private:

};


class B :public A
{
public:
    B(){};
    ~B(){};

    int factory_method()
    {
        cout << "我是B" << endl;
        return 0;
    }
private:

};


int main()
{

    B b;
    b.dis();
    getchar();
    return 0;
}

给之类提供一个挂钩以供对线的扩展版本。

  • 连接平行的类层次
    这种比较好理解,用的也比较多。
    提醒:比如类A的一些工作需要委托给类B ,那么类A就可以提供创建类B的工厂方法。这样就可以形成一种平行关系。而且对于客户来讲不需要知道类B是什么,直接通过类A可以创建

实现

  • Creator 类可以是抽象类,也可以是具体类。具体类可以为工厂方法提供一个缺省的实现。
  • 参数化工厂方法
    这个很好理解,通过给方法传递标识符来区别创建哪一个产品。

    B::methond(flag_id)
    {
    if(flag_id==1) return new product1;
    if(flag_id==2) return new product2;
    return A::methond(flag_id);   //调用父类的方法   子类只是扩展了父类的方法
    }
  • 使用模板来避免创建子类
    之前说了辣么多,可能发现一个问题,如果要创建一个新的产品,就得写一个新的工厂子类。分析问题的关键是没法确定到底创建那个产品,所以就不停的创建子类来重新实现方法。这个问题更加抽线的讲 就是没法确定 参数类型!很容易就想到了模板。

    template<calss products>
    Product * ConcreteCreate<products>:: createProduct()
    {
    return new products;
    }

通过模板参数来控制创建那个产品


我的个人网站 http://www.breeziness.cn/
我的优快云 http://blog.youkuaiyun.com/qq_33775402

转载请注明出处 小风code www.breeziness.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值