• Python使用抽象工厂模式和策略模式的组合实现生成指定长度的随机数


    设计模式选择理由:

    1. 抽象工厂模式

      • 抽象工厂模式适合于创建一组相关或依赖对象的场景。在这里,我们可以定义一个抽象工厂来创建不同类型(数字、字母、特殊符号)的随机数据生成器。
    2. 策略模式

      • 策略模式允许你定义一系列算法,并将每个算法封装起来,使它们可以互相替换。在这里,我们可以使用策略模式来定义不同类型数据的生成算法,例如数字生成策略、字母生成策略、特殊符号生成策略。

    示例实现:

    下面是一个简单的Python示例,结合抽象工厂模式和策略模式,用于生成随机数

    1. import random
    2. import string
    3. from abc import ABC, abstractmethod
    4. import numpy as np
    5. import random
    6. # 抽象工厂:数据生成器工厂
    7. class DataGeneratorFactory:
    8. def create_generator(self):
    9. pass
    10. # 具体工厂1:数字数据生成器工厂
    11. class NumberGeneratorFactory(DataGeneratorFactory):
    12. def create_generator(self):
    13. return NumberGenerator()
    14. # 具体工厂2:字母数据生成器工厂
    15. class LetterGeneratorFactory(DataGeneratorFactory):
    16. def create_generator(self):
    17. return LetterGenerator()
    18. # 具体工厂3:特殊符号数据生成器工厂
    19. class SymbolGeneratorFactory(DataGeneratorFactory):
    20. def create_generator(self):
    21. return SymbolGenerator()
    22. # 具体工厂4:字母、数字、特殊符号数据生成器工厂
    23. class LetterNumberSymbolGeneratorFactory(DataGeneratorFactory):
    24. def create_generator(self):
    25. return LetterNumberSymbolGenerator()
    26. # 具体工厂5:指定特殊符号数据生成器工厂
    27. class SymbolAGeneratorFactory(DataGeneratorFactory):
    28. def create_generator(self):
    29. return SymbolAGenerator()
    30. # 抽象产品:数据生成器接口
    31. class DataGenerator:
    32. def generate_data(self, length):
    33. pass
    34. # 具体产品1:数字数据生成器
    35. class NumberGenerator(DataGenerator):
    36. def generate_data(self, length):
    37. my_list = [random.randint(0, 9) for _ in range(length)]
    38. result = int(''.join(map(str, my_list)))
    39. return result
    40. # 具体产品2:字母数据生成器
    41. class LetterGenerator(DataGenerator):
    42. def generate_data(self, length):
    43. my_list = [random.choice(string.ascii_letters) for _ in range(length)]
    44. result = ''.join(my_list)
    45. return result
    46. # 具体产品3:特殊符号数据生成器
    47. class SymbolGenerator(DataGenerator):
    48. def generate_data(self, length):
    49. symbols = string.punctuation
    50. my_list = [random.choice(symbols) for _ in range(length)]
    51. result = ''.join(my_list)
    52. return result
    53. # 具体产品4:字母、数字、特殊符号数据生成器
    54. class LetterNumberSymbolGenerator(DataGenerator):
    55. def generate_data(self, length):
    56. symbols = string.ascii_letters + string.digits + string.punctuation # 随机字母+随机数字+随机特殊符号
    57. my_list = [random.choice(symbols) for _ in range(length)]
    58. result = ''.join(my_list)
    59. return result
    60. # 具体产品5:指定特殊符号数据生成器
    61. class SymbolAGenerator(DataGenerator):
    62. def generate_data(self, length):
    63. symbols = "!@#$%^&*()_+-=[]{}|;:,.<>/?"
    64. my_list = [random.choice(symbols) for _ in range(length)]
    65. result = ''.join(my_list)
    66. return result
    67. # 客户端代码
    68. def generate_random_array(factory, length):
    69. generator = factory.create_generator()
    70. return generator.generate_data(length)
    71. class RandomStrategy(ABC):
    72. # 抽象类:强制子类实现此方法
    73. @abstractmethod
    74. def fun_random(self, seed=None):
    75. pass
    76. class PortRandomStrategy(RandomStrategy):
    77. def fun_random(self, seed=None):
    78. random.seed(seed)
    79. port = random.randint(0, 65535)
    80. return port
    81. class IPRandomStrategy(RandomStrategy):
    82. def fun_random(self, seed=None):
    83. random.seed(seed)
    84. ip = ".".join(str(random.randint(0, 255)) for _ in range(4))
    85. return ip
    86. class SeqRandomStrategy(RandomStrategy):
    87. def fun_random(self, seed=None):
    88. random.seed(seed)
    89. seqRand = random.randint(0, (2**32) - 1)
    90. return seqRand
    91. factories = [NumberGeneratorFactory(), LetterGeneratorFactory(), SymbolGeneratorFactory(),LetterNumberSymbolGeneratorFactory(),SymbolAGeneratorFactory()]
    92. for factory in factories:
    93. random_data = generate_random_array(factory, 10)
    94. print(random_data)
    95. portRandom = PortRandomStrategy().fun_random()
    96. portRandomSeed = PortRandomStrategy().fun_random(3)
    97. ipRandom = IPRandomStrategy().fun_random()
    98. ipRandomSeed = IPRandomStrategy().fun_random(3)
    99. seqRandom = SeqRandomStrategy().fun_random()
    100. seqRandomSeed = SeqRandomStrategy().fun_random(3)
    101. print(portRandom,portRandomSeed)
    102. print(ipRandom, ipRandomSeed)
    103. print(seqRandom, seqRandomSeed)
    '
    运行

    1373322424
    LgVdMdRGjV
    `\~_+-/}>$
    XH.Q% >^;)!..-&]
    59444 31190
    172.42.130.11 121.66.189.242
    4152488277 2337446730

    • 抽象工厂和具体工厂DataGeneratorFactory是抽象工厂,定义了创建数据生成器的接口。

    • 抽象产品和具体产品DataGenerator是抽象产品接口,定义了生成数据的方法;实现了具体的生成算法。

    • 客户端代码generate_random_array函数接受一个工厂对象和长度作为参数,通过工厂创建对应类型的数据生成器,并生成随机数组。

    此设计可以扩展和修改不同类型数据的生成方式,保持代码结构清晰和可维护性高。

    使用抽象工厂和策略模式的组合,使代码符合开闭原则,即对扩展开放、对修改关闭。

  • 相关阅读:
    QT day2
    《痞子衡嵌入式半月刊》 第 94 期
    内网离线 k3s Rancher 高可用安装部署流程
    egg-mongoose update更新无效解决方案
    tcpdump后台不间断抓包
    Electron+Vue3整合-开发时整合-全部ts开发 + 一条命令启动vue3和electron两个服务
    js数据结构(队列Queue)
    【无标题】
    微信每日早安推送 Windows版
    时光邮局|来写一封未来的信试试吧!一个我的新项目,Java+Vue
  • 原文地址:https://blog.csdn.net/songpeiying/article/details/139810682