C++设计模式---工厂模式

        C++中工厂模式是一种创建型设计模式,它允许客户端代码通过调用工厂方法来创建对象,而无需直接使用new运算符实例化具体类。这种模式有助于将类的创建与使用相分离,并且在需要添加新的具体类时可以减少对客户端代码的影响。

        工厂模式通常有两种实现方式:简单工厂模式和抽象工厂模式。简单工厂模式是最基本的工厂模式,它通过一个静态方法来创建具体的对象。而抽象工厂模式则通过一个抽象工厂类来定义一组创建相关对象的方法,每个具体工厂类实现这些方法来创建特定的对象。

1、简单工厂模式

        简单工厂模式是最基本的工厂模式,它通过一个静态方法来创建具体的对象。

#include <iostream>  
#include <string>  
  
// 定义产品接口  【抽象类】
class Product {  
public:  
    virtual ~Product() {}  
    virtual void use() const = 0;  // 纯虚函数必须被子类重写
};  
  
// 定义具体产品类  
class ProductA : public Product {  
public:  
    void use() const override {  
        std::cout << "Using ProductA" << std::endl;  
    }  
};  
  
class ProductB : public Product {  
public:  
    void use() const override {  
        std::cout << "Using ProductB" << std::endl;  
    }  
};  
  
// 定义简单工厂类  
class SimpleFactory {  
public:  
    static Product* createProduct(const std::string& type) {  
        if (type == "A") {  
            return new ProductA();  
        } else if (type == "B") {  
            return new ProductB();  
        } else {  
            return nullptr;  
        }  
    }  
};  
  
// 客户端代码  
int main() {  
    Product* productA = SimpleFactory::createProduct("A");  
    if (productA) {  
        productA->use();  
        delete productA; // 释放内存  
    }  
  
    Product* productB = SimpleFactory::createProduct("B");  
    if (productB) {  
        productB->use();  
        delete productB; // 释放内存  
    }   
    return 0;  
}

结果:

Using ProductA
Using ProductB

2、抽象工厂模式

        抽象工厂模式则通过一个抽象工厂类来定义一组创建相关对象的方法,每个具体工厂类实现这些方法来创建特定的对象。

基本结构:

        (1)抽象工厂(AbstractFactory):声明了一组用于创建产品对象的操作接口。

        (2)具体工厂(ConcreteFactory):实现了抽象工厂接口,负责创建具体产品类的对象。

        (3)抽象产品(AbstractProduct):定义了一组产品的接口。

        (4)具体产品(ConcreteProduct):实现了抽象产品接口,是具体可使用的产品。

示例:有两个产品族(Car 和 Bike),每个产品族都有两个具体产品(SportsCarSedan 和 MountainBikeRoadBike)。

#include <iostream>  
#include <string>  

// 抽象产品  
class Car {  
public:  
    virtual ~Car() {}  
    virtual void show() = 0;  
};  
  
class Bike {  
public:  
    virtual ~Bike() {}  
    virtual void show() = 0;  
};  
  
// 具体产品  
class SportsCar : public Car {  
public:  
    void show() override { std::cout << "SportsCar" << std::endl; }  
};  
  
class Sedan : public Car {  
public:  
    void show() override { std::cout << "Sedan" << std::endl; }  
};  
  
class MountainBike : public Bike {  
public:  
    void show() override { std::cout << "MountainBike" << std::endl; }  
};  
  
class RoadBike : public Bike {  
public:  
    void show() override { std::cout << "RoadBike" << std::endl; }  
};  
  
// 抽象工厂  
class VehicleFactory {  
public:  
    virtual ~VehicleFactory() {}  
    virtual Car* createCar() = 0;      // 纯虚函数,必须被子类重写
    virtual Bike* createBike() = 0;    // 纯虚函数,必须被子类重写
};  
  
// 具体工厂  
class AmericanFactory : public VehicleFactory {  
public:  
    Car* createCar() override { return new SportsCar(); }  
    Bike* createBike() override { return new MountainBike(); }  
};  
  
class EuropeanFactory : public VehicleFactory {  
public:  
    Car* createCar() override { return new Sedan(); }  
    Bike* createBike() override { return new RoadBike(); }  
};  
  
// 客户端代码  
int main() {  
    VehicleFactory* americanFactory = new AmericanFactory();  
    Car* americanCar = americanFactory->createCar();  
    Bike* americanBike = americanFactory->createBike();  
    americanCar->show();  
    americanBike->show();  
  
    VehicleFactory* europeanFactory = new EuropeanFactory();  
    Car* europeanCar = europeanFactory->createCar();  
    Bike* europeanBike = europeanFactory->createBike();  
    europeanCar->show();  
    europeanBike->show();  
  
    // 记得释放内存  
    delete americanCar;  
    delete americanBike;  
    delete europeanCar;  
    delete europeanBike;  
    delete americanFactory;  
    delete europeanFactory;  
  
    return 0;  
}

结果:

SportsCar
MountainBike
Sedan
RoadBike

3、区别

(1)产品类数量:

        简单工厂模式:通常只有一个抽象产品类,可以派生出多个具体产品类。

        抽象工厂模式:有多个抽象产品类,每个抽象产品类都可以派生出多个具体产品类。

(2)工厂类功能:

        简单工厂模式:具体工厂类只能创建一个具体产品类的实例。

        抽象工厂模式:每个具体工厂类可以创建多个具体产品类的实例,即一个工厂可以创建属于同一产品族但不同等级结构的产品。

(3)接口数量:

        简单工厂模式:通常只使用一个接口,用于定义产品的公共方法。

        抽象工厂模式:可以使用无限个接口,每个接口对应一个抽象产品类,定义不同产品族的公共方法。

(4)创建对象方式:

        简单工厂模式:通过传入参数或配置文件来动态决定创建哪个具体产品类的实例。

        抽象工厂模式:无需指定产品的具体类,访问类可以通过抽象工厂接口获取同族的不同等级的产品。

(5)使用场景:

        简单工厂模式:适用于创建同种产品类型的复杂参数对象,尤其是当对象的创建过程很复杂,需要很多参数且大部分参数固定时。

        抽象工厂模式:适用于系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品的情况。它可以在类的内部对产品族中相关联的多等级产品共同管理。

(6)优缺点:

        简单工厂模式:优点:轻量级,代码结构简单清晰,工厂类可以生产不同的产品。缺点:系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,可能造成工厂逻辑过于复杂,违背了“开放-封闭”原则。

        抽象工厂模式:优点:可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。缺点:需要增加额外的抽象类和接口,增加了系统的复杂性。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计模式是在软件开发中常用的一种编程思想,它提供了一种解决问题的方法论,可以帮助开发者更加灵活和高效地开发软件。基于qt4开源跨平台开发框架的PDF设计模式主要包括以下几个方面。 首先,观察者模式是一种常用的设计模式,它可以用于实现PDF文件的订阅和通知功能。通过该模式,用户可以选择关注自己感兴趣的PDF文件,并在文件更新时接收到通知。 其次,工厂模式是常用的创建型设计模式,它可以帮助开发者根据需要创建不同类型的PDF文件。例如,可以使用工厂模式创建基本的PDF文件、加密的PDF文件或者带有水印的PDF文件。 再次,装饰器模式是一种结构型设计模式,可以用于在不修改现有代码的情况下为PDF文件添加额外的功能。开发者可以通过装饰器模式为PDF文件添加页眉、页脚、书签等功能,同时保持原有的PDF文件结构和功能不受影响。 此外,策略模式也是常用的设计模式之一,在PDF开发中可以用于实现不同的压缩策略和加密策略。通过策略模式,开发者可以根据需求选择不同的策略来实现对PDF文件的处理和管理。 最后,单例模式是一种创建型设计模式,可以确保在整个应用程序中只有一个PDF文件实例。通过单例模式,可以在不同的模块中共享同一个PDF文件对象,避免资源浪费和数据冲突。 总而言之,设计模式在基于qt4开源跨平台开发框架的PDF开发中具有重要的作用。以上提到的几种设计模式可以帮助开发者更好地组织和管理PDF文件,提高开发效率和代码的可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值