抽象工厂模式:
策略模式:
下面是一个简单的Python示例,结合抽象工厂模式和策略模式,用于生成随机数
- import random
- import string
- from abc import ABC, abstractmethod
- import numpy as np
- import random
-
- # 抽象工厂:数据生成器工厂
- 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)
-
-
- class RandomStrategy(ABC):
- # 抽象类:强制子类实现此方法
- @abstractmethod
- def fun_random(self, seed=None):
- pass
-
- class PortRandomStrategy(RandomStrategy):
- def fun_random(self, seed=None):
- random.seed(seed)
- port = random.randint(0, 65535)
- return port
-
- class IPRandomStrategy(RandomStrategy):
- def fun_random(self, seed=None):
- random.seed(seed)
- ip = ".".join(str(random.randint(0, 255)) for _ in range(4))
- return ip
-
- class SeqRandomStrategy(RandomStrategy):
- def fun_random(self, seed=None):
- random.seed(seed)
- seqRand = random.randint(0, (2**32) - 1)
- return seqRand
-
-
-
-
- factories = [NumberGeneratorFactory(), LetterGeneratorFactory(), SymbolGeneratorFactory(),LetterNumberSymbolGeneratorFactory(),SymbolAGeneratorFactory()]
- for factory in factories:
- random_data = generate_random_array(factory, 10)
- print(random_data)
-
-
- portRandom = PortRandomStrategy().fun_random()
- portRandomSeed = PortRandomStrategy().fun_random(3)
- ipRandom = IPRandomStrategy().fun_random()
- ipRandomSeed = IPRandomStrategy().fun_random(3)
- seqRandom = SeqRandomStrategy().fun_random()
- seqRandomSeed = SeqRandomStrategy().fun_random(3)
-
- print(portRandom,portRandomSeed)
- print(ipRandom, ipRandomSeed)
- print(seqRandom, seqRandomSeed)
-
-
'运行
1373322424
LgVdMdRGjV
`\~_+-/}>$
XH.Q%>^;)!..-&]
59444 31190
172.42.130.11 121.66.189.242
4152488277 2337446730
抽象工厂和具体工厂:DataGeneratorFactory是抽象工厂,定义了创建数据生成器的接口。
抽象产品和具体产品:DataGenerator是抽象产品接口,定义了生成数据的方法;实现了具体的生成算法。
客户端代码:generate_random_array函数接受一个工厂对象和长度作为参数,通过工厂创建对应类型的数据生成器,并生成随机数组。
此设计可以扩展和修改不同类型数据的生成方式,保持代码结构清晰和可维护性高。
使用抽象工厂和策略模式的组合,使代码符合开闭原则,即对扩展开放、对修改关闭。