• [架构设计] 创建型模型


    目录

    一、简单工厂模式

    二、工厂模式

     三、抽象工厂模式

     四、单例模式


    一、简单工厂模式

    类别描述
    适用场景
    • 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂
    • 客户端只知道传入工厂类的参数,对于如何创建对象并不关心
    优点
    • 实现了对象创建和使用的分离
    缺点
    • 工厂类职责过重
    • 增加系统中类的个数,复杂度增加
    • 违反“开闭原则”,添加新产品需要修改工厂逻辑
    1. #include
    2. using namespace std;
    3. //抽象水果,此处做了核心的工作
    4. class AbstractFruit {
    5. public:
    6. virtual void ShowName() = 0;
    7. };
    8. //苹果
    9. class Apple :public AbstractFruit {
    10. public:
    11. virtual void ShowName() {
    12. cout << "我是苹果!" << endl;
    13. }
    14. };
    15. //香蕉
    16. class Banana :public AbstractFruit {
    17. public:
    18. virtual void ShowName() {
    19. cout << "我是香蕉!" << endl;
    20. }
    21. };
    22. //鸭梨
    23. class Pear :public AbstractFruit {
    24. public:
    25. virtual void ShowName() {
    26. cout << "我是鸭梨!" << endl;
    27. }
    28. };
    29. //水果工厂
    30. class FruitFactor {
    31. public:
    32. static AbstractFruit * CreateFruit(string flag) {
    33. if (flag == "apple") {
    34. return new Apple;
    35. }
    36. else if (flag == "banana") {
    37. return new Banana;
    38. }
    39. else if (flag == "pear") {
    40. return new Pear;
    41. }
    42. else {
    43. return NULL;
    44. }
    45. }
    46. };
    47. int main(){
    48. FruitFactor* factory = new FruitFactor;
    49. AbstractFruit* fruit = factory->CreateFruit("apple");
    50. fruit->ShowName();
    51. delete fruit;
    52. fruit = factory->CreateFruit("banana");
    53. fruit->ShowName();
    54. delete fruit;
    55. fruit = factory->CreateFruit("pear");
    56. fruit->ShowName();
    57. delete fruit;
    58. fruit = NULL;
    59. delete factory;
    60. factory = NULL;
    61. return 0;
    62. }

    二、工厂模式

    类别描述
    适用场景
    • 适用于更复杂或更多的创建对象的工厂类
    优点
    • 针对工厂做了进一步抽象,从而让具体的工厂可以在适用的时候再实例化
    • 每个工厂的职责更加单一
    缺点
    • 需要创建很多工厂
    1. #include
    2. using namespace std;
    3. //抽象水果
    4. class AbstractFruit {
    5. public:
    6. virtual void ShowName() = 0;
    7. };
    8. //苹果
    9. class Apple :public AbstractFruit {
    10. public:
    11. virtual void ShowName() {
    12. cout << "我是苹果!" << endl;
    13. }
    14. };
    15. //香蕉
    16. class Banana :public AbstractFruit {
    17. public:
    18. virtual void ShowName() {
    19. cout << "我是香蕉!" << endl;
    20. }
    21. };
    22. //鸭梨
    23. class Pear :public AbstractFruit {
    24. public:
    25. virtual void ShowName() {
    26. cout << "我是鸭梨!" << endl;
    27. }
    28. };
    29. //抽象工厂,进一步抽象了一层,从而可以让工厂提供统一的接口,而不是具体的实现
    30. class AbstractFruitFactory {
    31. public:
    32. virtual AbstractFruit* CreateFruit() = 0;
    33. };
    34. //苹果工厂
    35. class AppleFactory :public AbstractFruitFactory {
    36. public:
    37. virtual AbstractFruit* CreateFruit() {
    38. return new Apple;
    39. }
    40. };
    41. //香蕉工厂
    42. class BananaFactory :public AbstractFruitFactory {
    43. public:
    44. virtual AbstractFruit* CreateFruit() {
    45. return new Banana;
    46. }
    47. };
    48. //梨工厂
    49. class PearFactory :public AbstractFruitFactory {
    50. public:
    51. virtual AbstractFruit* CreateFruit() {
    52. return new Pear;
    53. }
    54. };
    55. int main() {
    56. AbstractFruitFactory* factory = NULL;
    57. AbstractFruit* fruit = NULL;
    58. //创建一个苹果工厂
    59. factory = new AppleFactory;
    60. fruit = factory->CreateFruit();
    61. fruit->ShowName();
    62. delete fruit;
    63. delete factory;
    64. //创建一个香蕉工厂
    65. factory = new BananaFactory;
    66. fruit = factory->CreateFruit();
    67. fruit->ShowName();
    68. delete fruit;
    69. delete factory;
    70. //创建一个鸭梨工厂
    71. factory = new PearFactory;
    72. fruit = factory->CreateFruit();
    73. fruit->ShowName();
    74. delete fruit;
    75. delete factory;
    76. fruit = NULL;
    77. factory = NULL;
    78. return 0;
    79. }

     三、抽象工厂模式

    类别描述
    适用场景
    • 系统中有多于一个的产品族 (美 日 中,核心还是工厂抽象类一定要稳定)
    • 产品等级结构稳定 (比如增加桃子时,则抽象工厂得修改)
    优点
    • 产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象
    缺点
    • 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改
    1. #include
    2. using namespace std;
    3. //抽象苹果
    4. class AbstractApple {
    5. public:
    6. virtual void ShowName() = 0;
    7. };
    8. //中国苹果
    9. class ChinaApple :public AbstractApple {
    10. public:
    11. virtual void ShowName() {
    12. cout << "中国苹果!" << endl;
    13. }
    14. };
    15. //美国苹果
    16. class USAApple :public AbstractApple {
    17. public:
    18. virtual void ShowName() {
    19. cout << "美国苹果!" << endl;
    20. }
    21. };
    22. //日本苹果
    23. class JapanApple :public AbstractApple {
    24. public:
    25. virtual void ShowName() {
    26. cout << "日本苹果!" << endl;
    27. }
    28. };
    29. //抽象香蕉
    30. class AbstractBanana {
    31. public:
    32. virtual void ShowName() = 0;
    33. };
    34. //中国香蕉
    35. class ChinaBanana :public AbstractBanana {
    36. public:
    37. virtual void ShowName() {
    38. cout << "中国香蕉!" << endl;
    39. }
    40. };
    41. //美国香蕉
    42. class USABanan :public AbstractBanana {
    43. public:
    44. virtual void ShowName() {
    45. cout << "美国香蕉!" << endl;
    46. }
    47. };
    48. //日本香蕉
    49. class JapanBanan :public AbstractBanana {
    50. public:
    51. virtual void ShowName() {
    52. cout << "日本香蕉!" << endl;
    53. }
    54. };
    55. //抽象鸭梨
    56. class AbstractPear {
    57. public:
    58. virtual void ShowName() = 0;
    59. };
    60. //中国鸭梨
    61. class ChinaPear:public AbstractPear{
    62. public:
    63. virtual void ShowName() {
    64. cout << "中国鸭梨!" << endl;
    65. }
    66. };
    67. //美国鸭梨
    68. class USAPear :public AbstractPear {
    69. public:
    70. virtual void ShowName() {
    71. cout << "美国鸭梨!" << endl;
    72. }
    73. };
    74. //日本鸭梨
    75. class JapanPear :public AbstractPear {
    76. public:
    77. virtual void ShowName() {
    78. cout << "日本鸭梨!" << endl;
    79. }
    80. };
    81. //抽象工厂 针对产品族
    82. class AbstractFactory {
    83. public:
    84. virtual AbstractApple* CreateApple() = 0;
    85. virtual AbstractBanana* CreateBanana() = 0;
    86. virtual AbstractPear* CreatePear() = 0;
    87. };
    88. //中国工厂
    89. class ChinaFactory :public AbstractFactory {
    90. public:
    91. virtual AbstractApple* CreateApple() {
    92. return new ChinaApple;
    93. }
    94. virtual AbstractBanana* CreateBanana(){
    95. return new ChinaBanana;
    96. }
    97. virtual AbstractPear* CreatePear() {
    98. return new ChinaPear;
    99. }
    100. };
    101. //美国工厂
    102. class USAFactory :public AbstractFactory {
    103. public:
    104. virtual AbstractApple* CreateApple() {
    105. return new USAApple;
    106. }
    107. virtual AbstractBanana* CreateBanana() {
    108. return new USABanan;
    109. }
    110. virtual AbstractPear* CreatePear() {
    111. return new USAPear;
    112. }
    113. };
    114. //日本工厂
    115. class JapanFactory :public AbstractFactory {
    116. public:
    117. virtual AbstractApple* CreateApple() {
    118. return new JapanApple;
    119. }
    120. virtual AbstractBanana* CreateBanana() {
    121. return new JapanBanan;
    122. }
    123. virtual AbstractPear* CreatePear() {
    124. return new JapanPear;
    125. }
    126. };
    127. int main() {
    128. AbstractFactory* factory = NULL;
    129. AbstractApple* apple = NULL;
    130. AbstractBanana* banana = NULL;
    131. AbstractPear* pear = NULL;
    132. //中国工厂
    133. factory = new ChinaFactory;
    134. apple = factory->CreateApple();
    135. banana = factory->CreateBanana();
    136. pear = factory->CreatePear();
    137. apple->ShowName();
    138. banana->ShowName();
    139. pear->ShowName();
    140. return 0;
    141. }

     四、单例模式

    只允许有一个类对象存在的一种模式

    类别描述

    适用场景

    • 系统只需要一个实例对象
    • 客户调用类的单个实例只允许使用一个公共访问点
    优点
    • 单例模式提供了对唯一实例的受控访问
    • 节约系统资源。由于在系统内存中只存在一个对象。
    缺点
    • 扩展略难
    • 单例类的职责过重
    • 1.懒汉式(需要的时候才会创建)
    • 2.饿汉式(直接静态创建,程序起来前就创建好了) -- 解决多线程问题
    1. #include
    2. using namespace std;
    3. class A {
    4. private:
    5. A() {
    6. a = new A;
    7. }
    8. public:
    9. static A* getInstance() {
    10. return a;
    11. }
    12. private:
    13. static A* a;
    14. };
    15. A* A::a = NULL;
    16. //实现单例步骤
    17. //1.构造函数私有化
    18. //2.增加静态私有的当前类的指针变量
    19. //3.提供静态对外接口,可以让用户获得单例对象
    20. //单例 分为懒汉式 饿汉式
    21. //1.懒汉式(需要的时候才会创建)
    22. class Singleton_lazy {
    23. private:
    24. Singleton_lazy() { cout << "我是懒汉构造!" << endl; }
    25. public:
    26. static Singleton_lazy* getInstance() {
    27. if (pSingleton == NULL) { /*此处判断有可能被强占执行*/
    28. pSingleton = new Singleton_lazy;
    29. }
    30. return pSingleton;
    31. }
    32. private:
    33. static Singleton_lazy* pSingleton;
    34. };
    35. //类外初始化
    36. Singleton_lazy* Singleton_lazy::pSingleton = NULL;
    37. //2.饿汉式
    38. class Singleton_hungry {
    39. private:
    40. Singleton_hungry() { cout << "我是饿汉构造!" << endl; }
    41. public:
    42. static Singleton_hungry* getInstance() {
    43. return pSingleton;
    44. }
    45. private:
    46. static Singleton_hungry* pSingleton;
    47. };
    48. //类外初始化,此时已经创建对象完了
    49. Singleton_hungry* Singleton_hungry::pSingleton = new Singleton_hungry;
    50. int main() {
    51. Singleton_lazy* p1 = Singleton_lazy::getInstance();
    52. Singleton_lazy* p2 = Singleton_lazy::getInstance();
    53. if (p1 == p2) {
    54. cout << "两个指针指向同一块内存空间,是单例!" << endl;
    55. }
    56. else {
    57. cout << "不是单例模式!" << endl;
    58. }
    59. Singleton_hungry* p3 = Singleton_hungry::getInstance();
    60. Singleton_hungry* p4 = Singleton_hungry::getInstance();
    61. if (p3 == p4) {
    62. cout << "两个指针指向同一块内存空间,是单例!" << endl;
    63. }
    64. else {
    65. cout << "不是单例模式!" << endl;
    66. }
    67. cout << "main函数开始执行!" << endl;
    68. return 0;
    69. }

  • 相关阅读:
    【Flink】第一节 源码编译
    linux网络协议栈源码分析 - 链路层ARP地址解析协议
    私域电商模式全解析:掌握这些方法,让你的生意不再难做!
    Halcon—3D测量算法的那点数学公式和代码实现
    服务注册发现_服务自保和服务剔除机制
    【PPT制作】基础篇
    Nginx原理以及基础知识详解
    图神经网络关系抽取论文阅读笔记(五)
    C# 学习之路(类型、存储和变量)
    AtCoder Beginner Contest 263 G.Erasing Prime Pairs(二分图最大匹配-网络流)
  • 原文地址:https://blog.csdn.net/AgingMoon/article/details/128171540