定义
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义一个用于创建对象的接口,但由一个单独的类来实现实际创建的工作。简单工厂模式通过在一个类中集中管理对象的创建过程,可以减少客户端与具体类之间的耦合,使得代码结构更加清晰和易于维护。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
为什么使用简单工厂模式?
- 统一管理对象创建:
- 简单工厂模式将对象的创建逻辑集中到一个工厂类中,客户端不需要知道具体的创建细节,只需调用工厂类提供的方法即可获得所需的对象,减少了客户端对类创建过程的依赖。
- 减少耦合:
- 客户端与具体类之间的依赖被转移到了工厂类,客户端不再直接依赖具体类,从而降低了系统的耦合度。
- 更好的维护性:
- 当需要更改对象的创建逻辑或引入新的对象类型时,只需修改工厂类,而不需要修改客户端代码,提高了系统的可维护性。
实现步骤
-
定义抽象产品类
- 定义所有具体产品类的共同接口,客户端将通过这个接口来使用具体产品。
-
实现具体产品类
- 实现产品接口的具体产品类,这些类包含了产品的实际业务逻辑。
-
定义工厂类
- 定义一个工厂类,包含一个用于创建产品对象的静态方法,根据不同的参数来实例化不同的具体产品类,并返回产品接口类型的对象。
优缺点和适用场景
优点
-
统一管理对象创建
- 将对象创建逻辑集中管理,使代码更加清晰易懂。
-
减少客户端与具体类的耦合
- 客户端只需依赖于产品接口和工厂类,不再直接依赖具体产品类。
-
便于扩展和维护
- 添加新产品类时,只需修改工厂类,客户端代码无需变动。
缺点
-
工厂类的职责过重
- 工厂类集中了所有产品对象的创建逻辑,可能导致代码过于复杂,不利于扩展。
-
不符合开闭原则
- 添加新产品时需要修改工厂类的代码,违背了开闭原则。
适用场景
-
对象创建逻辑复杂
- 当对象的创建过程较为复杂时,可以使用简单工厂模式将创建逻辑集中管理,简化客户端代码。
-
客户端不需要关心对象的创建细节
- 当客户端不需要知道对象的创建过程,只需使用对象时,可以使用简单工厂模式隐藏创建细节。
咖啡店的例子
假设我们有一个咖啡店,根据客户的需求生产不同类型的咖啡。我们可以使用简单工厂模式来实现咖啡的创建。
#include <iostream> #include <memory> #include <string> // 抽象产品类:咖啡 class Coffee { public: virtual ~Coffee() {} virtual std::string getDescription() const = 0; virtual double cost() const = 0; }; // 具体产品类:美式咖啡 class Americano : public Coffee { public: std::string getDescription() const override { return "Americano"; } double cost() const override { return 5.0; } }; // 具体产品类:拿铁咖啡 class Latte : public Coffee { public: std::string getDescription() const override { return "Latte"; } double cost() const override { return 6.0; } }; // 简单工厂类 class CoffeeFactory { public: enum CoffeeType { AMERICANO, LATTE }; static std::shared_ptr<Coffee> createCoffee(CoffeeType type) { switch (type) { case AMERICANO: return std::make_shared<Americano>(); case LATTE: return std::make_shared<Latte>(); default: return nullptr; } } }; int main() { // 创建美式咖啡 std::shared_ptr<Coffee> americano = CoffeeFactory::createCoffee(CoffeeFactory::AMERICANO); std::cout << "Description: " << americano->getDescription() << ", Cost: " << americano->cost() << " RMB" << std::endl; // 创建拿铁咖啡 std::shared_ptr<Coffee> latte = CoffeeFactory::createCoffee(CoffeeFactory::LATTE); std::cout << "Description: " << latte->getDescription() << ", Cost: " << latte->cost() << " RMB" << std::endl; return 0; }
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容