工厂模式与虚函数

本文通过C++代码示例对比介绍了简单工厂模式与工厂方法模式。简单工厂模式通过一个工厂类集中创建产品族中的所有实例;而工厂方法模式则定义了一个创建产品对象的接口,由子类决定实例化哪个产品类。两种模式各有优缺点。

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

/// simple factoty 简单工厂模式
#include <iostream>
using namespace std;

class Product
{
public:
    Product() {}
    virtual ~Product() {}   // 因为有虚方法,析构函数最好声明为virtual

    virtual string who() const {}   // 虚函数,重写后用来表示派生类身份
};

class IPhone : public Product
{
public:
    IPhone() {}
    virtual ~IPhone() {}

    virtual string who() const
    {
        return string("I'm IPhone ");
    }
};

class IPad : public Product
{
public:
    IPad() {}
    virtual ~IPad() {}

    virtual string who() const
    {
        return string("I'm IPad ");
    }
};

class IPod : public Product
{
public:
    IPod() {}
    virtual ~IPod() {}

    virtual string who() const
    {
        return string("I'm IPod ");
    }
};

class SimpleFactory
{
public:
    SimpleFactory() {}
    ~SimpleFactory() {}

    Product* createProduct(string proName);
};

Product* SimpleFactory::createProduct(string proName)
{
    if ("IPhone" == proName)
        return new IPhone();
    else if ("IPad" == proName)
        return new IPad();
    else if ("IPod" == proName)
        return new IPod();
    else
        return NULL;
}

int main(int argc, char* argv[])
{
    SimpleFactory* sf = new SimpleFactory();
    Product* p;

    p = sf->createProduct("IPhone");
    cout << p->who() << endl;
    p = sf->createProduct("IPad");
    cout << p->who() << endl;
    p = sf->createProduct("IPod");
    cout << p->who() << endl;
}

/// 优点:外界只要传入类的名字或者识别符即可,不需要关心具体创建过程,只顾“消费”就可以了。
/// 各有各的指责和权力,分工明确,利于整个软件架构优化。

/// 缺点:违反里高内聚责任分配原则,将全部逻辑放到一个工厂类中,如果需要支持新的类,那就必须改变工厂类了。
///       这里只有一种工厂,一个系列的产品,那如果有多个系列的产品呢?问题如何解决?



我所理解的设计模式(C++实现)——简单工厂模式(Simple Factory Pattern)




/// factory method pattern 工厂方法模式
#include <iostream>
using namespace std;

class Product
{
public:
    Product() {}
    virtual ~Product() {}

    virtual string who() const {}
};

class IPhone : public Product
{
public:
    IPhone() {}
    virtual ~IPhone() {}
    virtual string who() const { return string("I'm IPhone.");}
};

class IPad : public Product
{
public:
    IPad() {}
    virtual ~IPad() {}
    virtual string who() const { return string("I'm IPad.");}
};

class Factory
{
public:
    Factory() {}
    virtual ~Factory() {}

    virtual Product* getProduct() const {}
};

class IPhoneFac:public Factory
{
public:
    IPhoneFac() {}
    virtual ~IPhoneFac() {}

    virtual Product* getProduct() const { return new IPhone(); }
};

class IPadFac:public Factory
{
public:
    IPadFac() {}
    virtual ~IPadFac() {}

    virtual Product* getProduct() const { return new IPad(); }
};

int main(int argc, char* argv[])
{
    Product* p;
    Factory* f;

    f = new IPhoneFac();
    p = f->getProduct();
    cout << p->who() << endl;

    f = new IPadFac();
    p = f->getProduct();
    cout << p->who() << endl;

}



我所理解的设计模式(C++实现)——工厂方法模式(Factory Method Pattern)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值