设计模式--抽象工厂模式

设计模式–抽象工厂模式

思路

设计一系列的后续需要使用的接口,后面只需要实现接口即可。
在这里插入图片描述

优点

1.解耦状态和行为:客户端不需要知道具体产品类的名称,只需要知道抽象工厂和抽象产品的接口。这样可以降低客户端与具体产品类之间的耦合度,使得系统更容易维护和扩展。
2.可维护性和可扩展性:当需要增加一种新的产品系列时,可以创建一个新的具体工厂类来实现抽象工厂接口。这个新的具体工厂负责创建新的产品系列中的各个产品。
3.可复用性:工厂类、产品类都可以封装起来,在其他项目中使用。

设计

一个工厂可以创建一组相关的产品。但不同工厂之间的产品应该是相似的,都是由同一个抽象产品实现来的。
比如有两个品牌的文具厂1和2。他们都能生产橡皮和铅笔。

#include <iostream>

// 抽象产品:铅笔
class AbstractPencil {
public:
    virtual void draw() = 0;
};

// 具体产品:普通铅笔
class NormalPencil : public AbstractPencil {
public:
    void draw() override {
        std::cout << "Normal pencil is drawing." << std::endl;
    }
};

// 具体产品:彩色铅笔
class ColorPencil : public AbstractPencil {
public:
    void draw() override {
        std::cout << "Color pencil is drawing." << std::endl;
    }
};

// 抽象产品:橡皮
class AbstractEraser {
public:
    virtual void erase() = 0;
};

// 具体产品:普通橡皮
class NormalEraser : public AbstractEraser {
public:
    void erase() override {
        std::cout << "Normal eraser is erasing." << std::endl;
    }
};

// 具体产品:卡通橡皮
class CartoonEraser : public AbstractEraser {
public:
    void erase() override {
        std::cout << "Cartoon eraser is erasing." << std::endl;
    }
};

// 抽象工厂
class AbstractFactory {
public:
    virtual AbstractPencil* createPencil() = 0;
    virtual AbstractEraser* createEraser() = 0;
};

// 具体工厂 1
class Factory1 : public AbstractFactory {
public:
    AbstractPencil* createPencil() override {
        return new NormalPencil();
    }
    AbstractEraser* createEraser() override {
        return new NormalEraser();
    }
};

// 具体工厂 2
class Factory2 : public AbstractFactory {
public:
    AbstractPencil* createPencil() override {
        return new ColorPencil();
    }
    AbstractEraser* createEraser() override {
        return new CartoonEraser();
    }
};

int main() {
    AbstractFactory* factory1 = new Factory1();
    AbstractPencil* pencil1 = factory1->createPencil();
    AbstractEraser* eraser1 = factory1->createEraser();
    pencil1->draw();
    eraser1->erase();

    delete pencil1;
    delete eraser1;
    delete factory1;

    AbstractFactory* factory2 = new Factory2();
    AbstractPencil* pencil2 = factory2->createPencil();
    AbstractEraser* eraser2 = factory2->createEraser();
    pencil2->draw();
    eraser2->erase();

    delete pencil2;
    delete eraser2;
    delete factory2;

    return 0;
}

在创建1号工厂后,就可以生产里面的普通铅笔和普通橡皮了。有了铅笔橡皮可以进行写字、擦除操作。
为了挤占市场,市面上又多了一个3号工厂的话,它为了创新,生产了可以更换笔芯的自动铅笔和更好用的高级橡皮。那么这时候只需要创建一个具体的3号工厂和具体产品A3(自动铅笔)和具体产品B3(高级橡皮)即可,无需修改其他已经完成的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值