经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式之工厂模式(学习笔记)
来源:cnblogs  作者:大雄的叮当猫  时间:2024/7/17 10:57:21  对本文有异议

定义

工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类来决定实例化哪一个类。工厂方法使得类的实例化延迟到子类,这样可以让客户端在不需要知道具体类的情况下创建对象。工厂方法模式通过使用继承和多态性,允许子类来控制对象的创建方式,能够更好地应对对象创建的复杂性和变化性。
 

为什么使用工厂方法模式?

1. 遵循开闭原则

   - 工厂方法模式通过引入新的子类来扩展系统,而不需要修改现有代码,从而符合开闭原则。

2. 更灵活的对象创建

   - 工厂方法模式将对象创建延迟到子类,这样可以通过重写工厂方法来定制对象的创建过程。

3. 支持产品族的扩展

   - 当系统中有多个产品等级结构时,可以通过工厂方法模式来管理不同等级的产品创建过程。
 

实现步骤

1. 定义抽象产品类

   - 定义所有具体产品类的共同接口,客户端将通过这个接口来使用具体产品。

2. 实现具体产品类

   - 实现产品接口的具体产品类,这些类包含了产品的实际业务逻辑。

3. 定义抽象工厂类

   - 定义一个抽象工厂类,包含一个用于创建产品对象的抽象方法,子类将实现该方法来创建具体产品对象。

4. 实现具体工厂类

   - 继承抽象工厂类并实现其抽象方法,具体工厂类负责创建具体产品对象。
 

优缺点和适用场景

优点

1. 遵循开闭原则

   - 新增产品时无需修改已有系统代码,符合开闭原则。

2. 更灵活的对象创建

   - 子类可以通过重写工厂方法来定制对象的创建过程,提供更灵活的对象创建机制。

3. 支持产品族扩展

   - 能够很好地应对产品族的扩展和变化。
 

缺点

1. 增加类的数量

   - 每新增一种产品类型,都需要增加一个具体工厂类,可能导致系统中类的数量增加。

2. 复杂度增加

   - 与简单工厂模式相比,工厂方法模式引入了更多的类和接口,增加了系统的复杂性。
 

适用场景

1. 系统需要灵活和可扩展的对象创建机制

   - 当系统需要灵活地创建对象,并且能够应对产品族的变化时,可以使用工厂方法模式。

2. 遵循开闭原则

   - 当系统需要遵循开闭原则,避免修改现有代码来扩展新功能时,适合使用工厂方法模式。
 

工厂方法模式与简单工厂模式的对比

1. 职责分配

   - 简单工厂模式将对象创建集中在一个工厂类中,而工厂方法模式将对象创建延迟到具体子类中,职责更加分散。

2. 开闭原则

   - 简单工厂模式在引入新产品时需要修改工厂类,违背了开闭原则;工厂方法模式通过新增具体工厂类来扩展新产品,符合开闭原则。

3. 复杂性

   - 简单工厂模式结构较为简单,适用于创建逻辑不复杂的场景;工厂方法模式结构较为复杂,适用于创建逻辑复杂且需要灵活扩展的场景。
 

咖啡店的例子

我们可以使用工厂方法模式来实现咖啡店不同类型咖啡的创建。
  1. #include <iostream>
  2. #include <memory>
  3. #include <string>
  4.  
  5. // 抽象产品类:咖啡
  6. class Coffee {
  7. public:
  8. virtual ~Coffee() {}
  9. virtual std::string getDescription() const = 0;
  10. virtual double cost() const = 0;
  11. };
  12. // 具体产品类:美式咖啡
  13. class Americano : public Coffee {
  14. public:
  15. std::string getDescription() const override {
  16. return "Americano";
  17. }
  18. double cost() const override {
  19. return 5.0;
  20. }
  21. };
  22. // 具体产品类:拿铁咖啡
  23. class Latte : public Coffee {
  24. public:
  25. std::string getDescription() const override {
  26. return "Latte";
  27. }
  28. double cost() const override {
  29. return 6.0;
  30. }
  31. };
  32. // 抽象工厂类
  33. class CoffeeFactory {
  34. public:
  35. virtual ~CoffeeFactory() {}
  36. virtual std::shared_ptr<Coffee> createCoffee() const = 0;
  37. };
  38. // 具体工厂类:美式咖啡工厂
  39. class AmericanoFactory : public CoffeeFactory {
  40. public:
  41. std::shared_ptr<Coffee> createCoffee() const override {
  42. return std::make_shared<Americano>();
  43. }
  44. };
  45. // 具体工厂类:拿铁咖啡工厂
  46. class LatteFactory : public CoffeeFactory {
  47. public:
  48. std::shared_ptr<Coffee> createCoffee() const override {
  49. return std::make_shared<Latte>();
  50. }
  51. };
  52. int main() {
  53. // 创建美式咖啡
  54. std::shared_ptr<CoffeeFactory> americanoFactory = std::make_shared<AmericanoFactory>();
  55. std::shared_ptr<Coffee> americano = americanoFactory->createCoffee();
  56. std::cout << "Description: " << americano->getDescription() << ", Cost: " << americano->cost() << " RMB" << std::endl;
  57. // 创建拿铁咖啡
  58. std::shared_ptr<CoffeeFactory> latteFactory = std::make_shared<LatteFactory>();
  59. std::shared_ptr<Coffee> latte = latteFactory->createCoffee();
  60. std::cout << "Description: " << latte->getDescription() << ", Cost: " << latte->cost() << " RMB" << std::endl;
  61. return 0;
  62. }

 

原文链接:https://www.cnblogs.com/best-doraemon/p/18306190

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号