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

设计模式选择理由:

  1. 抽象工厂模式:

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

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

示例实现:

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

python 复制代码
import random
import string

# 抽象工厂:数据生成器工厂
class DataGeneratorFactory:
    def create_generator(self):
        pass

# 具体工厂1:数字数据生成器工厂
class NumberGeneratorFactory(DataGeneratorFactory):
    def create_generator(self):
        return NumberGenerator()

# 具体工厂2:字母数据生成器工厂
class LetterGeneratorFactory(DataGeneratorFactory):
    def create_generator(self):
        return LetterGenerator()

# 具体工厂3:特殊符号数据生成器工厂
class SymbolGeneratorFactory(DataGeneratorFactory):
    def create_generator(self):
        return SymbolGenerator()

# 具体工厂4:字母、数字、特殊符号数据生成器工厂
class LetterNumberSymbolGeneratorFactory(DataGeneratorFactory):
    def create_generator(self):
        return LetterNumberSymbolGenerator()

# 具体工厂5:指定特殊符号数据生成器工厂
class SymbolAGeneratorFactory(DataGeneratorFactory):
    def create_generator(self):
        return SymbolAGenerator()

# 抽象产品:数据生成器接口
class DataGenerator:
    def generate_data(self, length):
        pass

# 具体产品1:数字数据生成器
class NumberGenerator(DataGenerator):
    def generate_data(self, length):
        my_list = [random.randint(0, 9) for _ in range(length)]
        result = int(''.join(map(str, my_list)))
        return result

# 具体产品2:字母数据生成器
class LetterGenerator(DataGenerator):
    def generate_data(self, length):
        my_list = [random.choice(string.ascii_letters) for _ in range(length)]
        result = ''.join(my_list)
        return result

# 具体产品3:特殊符号数据生成器
class SymbolGenerator(DataGenerator):
    def generate_data(self, length):
        symbols = string.punctuation
        my_list = [random.choice(symbols) for _ in range(length)]
        result = ''.join(my_list)
        return result

# 具体产品4:字母、数字、特殊符号数据生成器
class LetterNumberSymbolGenerator(DataGenerator):
    def generate_data(self, length):
        symbols = string.ascii_letters + string.digits + string.punctuation  # 随机字母+随机数字+随机特殊符号
        my_list = [random.choice(symbols) for _ in range(length)]
        result = ''.join(my_list)
        return result

# 具体产品5:指定特殊符号数据生成器
class SymbolAGenerator(DataGenerator):
    def generate_data(self, length):
        symbols = "!@#$%^&*()_+-=[]{}|;:,.<>/?"
        my_list = [random.choice(symbols) for _ in range(length)]
        result = ''.join(my_list)
        return result

# 客户端代码
def generate_random_array(factory, length):
    generator = factory.create_generator()
    return generator.generate_data(length)




factories = [NumberGeneratorFactory(), LetterGeneratorFactory(), SymbolGeneratorFactory(),LetterNumberSymbolGeneratorFactory(),SymbolAGeneratorFactory()]
for factory in factories:
    random_data = generate_random_array(factory, 10)
    print(random_data)

8275725222

hvAhepveIn

-;($@\:&|%

#s\^*p9,?#

$>!{^.)-+&

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

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

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

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

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

相关推荐
福大大架构师每日一题2 天前
ollama v0.40.11发布:macOS原生语音生成上线,d3决策模型正式加入
macos·策略模式
AIex-YH5 天前
发酵罐里点一盏灯:光发酵,正在重算微藻蛋白的成本账
运维·制造·策略模式
snakecy5 天前
macOS 安装 LaTeX 全流程指南:从 MacTeX 到中文排版
macos·策略模式
钱栈up10 天前
从 macOS 切回 Windows,我用 5 个免费工具把 80% 操作习惯搬了回来
windows·macos·策略模式
kunicoding12 天前
C++ 策略模式实战:写一个可以“一键换输出“的日志系统
开发语言·c++·策略模式
峥嵘life13 天前
Android16 开机后立即打开相机闪退问题分析与解决总结
android·开发语言·数码相机·策略模式
智慧城市203014 天前
关键供应商连续交付不合格批次,说明质量风险可能持续存在。企业需要建立“批次隔离、加严检验、驻厂遏制、复检放行、供应商升级”的处置闭环,同时统筹保供。
数据分析·策略模式·战略咨询·流程管理
happy_baymax15 天前
Dell G3 3590 黑苹果实战:OpenCore 1.0.8 + NullMoth 驱动让 GTX 1660 跑起 Metal
策略模式
遇码15 天前
macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件
rust·图形渲染·策略模式·桌面应用·gpui
mmsx16 天前
Android 架构分层:MVVM 与 MVP 共存,网络层怎么切
android·策略模式·mvvm·mvp