### 设计模式C++版示例代码 #### 简单工厂模式 简单工厂模式,也被称作静态工厂方法模式,虽然它并非GoF(Gang of Four)所定义的23种设计模式之一,但在实际开发过程中却非常常用。简单工厂模式的主要作用在于将对象的创建与使用分离,使得客户端只需关注如何使用这些对象,而无需关心它们是如何被创建的。 **特点:** 1. **静态工厂方法统一管理对象的创建。** 在简单工厂模式中,通常会有一个静态工厂类负责根据不同的条件来创建不同类型的对象。这样可以避免客户端直接创建对象,从而降低了客户端代码的复杂性,并且使得对象的创建更加灵活。 2. **静态工厂方法推迟了产品的实例化。** 这意味着可以通过配置文件或其他方式来动态指定具体要创建的对象类型,而不必重新编译代码。这对于需要频繁更改创建的对象类型的应用来说非常有用。 **优点:** - 简化客户端代码:客户端无需知道具体的产品类名,只需调用工厂类中的静态方法即可获取所需对象。 - 易于扩展:当需要添加新的产品时,只需要在工厂类中添加相应的创建逻辑即可,不需要修改客户端代码。 **缺点:** - 违反开闭原则:如果需要增加新产品,则需要修改工厂类,使得工厂类变得庞大和难以维护。 - 类型安全问题:在编译阶段无法检查参数的有效性。 **示例代码解析:** ```cpp // Nokia抽象产品 #pragma once #include <string> #include <iostream> class CNokia { public: CNokia(void); virtual ~CNokia(void); virtual bool MakeCall(const std::string &number) const = 0; }; // N96型号的Nokia手机产品类 class CN96 : public CNokia { public: CN96(void); virtual ~CN96(void); virtual bool MakeCall(const std::string &number) const; }; // N95型号的Nokia手机产品类 class CN95 : public CNokia { public: CN95(void); virtual ~CN95(void); virtual bool MakeCall(const std::string &number) const; }; ``` 以上代码定义了一个简单的Nokia手机抽象基类`CNokia`以及两个具体的实现类`CN96`和`CN95`。每个实现类都重写了基类中的纯虚函数`MakeCall`。 接下来,我们需要一个工厂类来创建这些对象: ```cpp class CNokiaFactory { public: static CNokia *CreateNokia(const std::string &model) { if (model == "N96") { return new CN96(); } else if (model == "N95") { return new CN95(); } // 默认返回空指针或抛出异常 return nullptr; } }; ``` 在这个简单的工厂模式中,`CNokiaFactory`类提供了一个静态方法`CreateNokia`用于根据传入的型号创建对应的对象。这种方法的优点是客户端只需要知道工厂类,而不需要知道具体的实现类名称,从而降低了耦合度。 #### 工厂方法模式——GoF 工厂方法模式是GoF定义的设计模式之一,它是简单工厂模式的一种改进。在工厂方法模式中,接口负责定义创建某一产品的规范,而其子类则负责实现这个接口以完成具体产品的创建。 **特点:** - 定义了一个创建对象的接口,但由子类决定实例化哪一个类。 - 工厂方法使一个类的实例化延迟到其子类。 **优点:** - 遵循开闭原则:可以在不修改原有代码的情况下引入新的产品类。 - 增加了灵活性:允许系统在不修改工厂角色的情况下引进新产品。 **示例代码:** ```cpp class INokiaFactory { public: virtual CNokia *CreateNokia() = 0; }; class CN96Factory : public INokiaFactory { public: CNokia *CreateNokia() override { return new CN96(); } }; class CN95Factory : public INokiaFactory { public: CNokia *CreateNokia() override { return new CN95(); } }; ``` 在上面的例子中,我们定义了一个抽象工厂类`INokiaFactory`和两个具体的工厂类`CN96Factory`和`CN95Factory`。每个工厂类都实现了`INokiaFactory`接口中的`CreateNokia`方法,用于创建特定的Nokia手机实例。 通过这种方式,我们可以轻松地为每一种手机型号创建一个工厂类,而不需要修改现有的代码。这使得系统的扩展性和维护性大大增强。 #### 抽象工厂模式——GoF 抽象工厂模式是GoF定义的另一种设计模式,它是一种更为高级的工厂模式。抽象工厂模式不仅可以创建单个对象,还可以创建一组相关的或相互依赖的对象。 **特点:** - 提供一个接口,用于创建一系列相关或相互依赖的对象族,而无需指定它们具体的类。 - 抽象工厂模式的核心在于提供了一组相关对象的创建接口,而这些对象通常需要协同工作。 **优点:** - 可以创建一系列相关的产品族,便于管理和维护。 - 支持产品族的扩展,即可以在不修改现有代码的基础上增加新的产品族。 **示例代码:** ```cpp class INokiaFactory { public: virtual CNokia *CreateNokia() = 0; virtual CAccessory *CreateAccessory() = 0; }; class CN96Factory : public INokiaFactory { public: CNokia *CreateNokia() override { return new CN96(); } CAccessory *CreateAccessory() override { return new CAccessoryForN96(); } }; class CN95Factory : public INokiaFactory { public: CNokia *CreateNokia() override { return new CN95(); } CAccessory *CreateAccessory() override { return new CAccessoryForN95(); } }; ``` 在这个例子中,除了创建手机之外,每个工厂还负责创建相应的配件。这种模式非常适合于需要同时创建多个相关对象的情况,如创建一套完整的设备及其附件。 简单工厂模式、工厂方法模式和抽象工厂模式各有优势和适用场景。简单工厂模式简单易用,适用于产品种类不多且相对稳定的场景;工厂方法模式遵循开闭原则,适用于产品种类可能增加的场景;抽象工厂模式可以创建一系列相关的产品族,适用于需要创建多个相关对象的场景。
剩余63页未读,继续阅读
- 粉丝: 20
- 资源: 28
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助