From fe94d8ed1b676e8a2633ba417fe825d9267fcc22 Mon Sep 17 00:00:00 2001 From: zj3D Date: Tue, 19 Mar 2024 09:39:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=AB=E5=85=83=E4=BF=AE=E8=AE=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 16 其它/对象设计模式/享元.py | 33 +++++++++++++ 16 其它/对象设计模式/对象引用.py | 50 -------------------- 2 files changed, 33 insertions(+), 50 deletions(-) create mode 100644 16 其它/对象设计模式/享元.py delete mode 100644 16 其它/对象设计模式/对象引用.py diff --git a/16 其它/对象设计模式/享元.py b/16 其它/对象设计模式/享元.py new file mode 100644 index 0000000..baa00c1 --- /dev/null +++ b/16 其它/对象设计模式/享元.py @@ -0,0 +1,33 @@ +# 创建对象是消耗资源的,如果发现对象已经存在,可以返回引用,不创造新对象 。设计模式中这个做法叫享元 +from cppy.cp_util import * + +#享元类 +class WordFrequencyController(): + def __init__(self, controllertype,filepath ): + word_list = extract_file_words(filepath) + word_freq = get_frequencies(word_list) + self.word_freq = sort_dict(word_freq) + self.number = controllertype + def print_word_freqs( self ): + print_word_freqs( self.word_freq,self.number) + +#享元工厂 +class WordFrequencyControllerFactory(): + def __init__(self): + self.types = {} + + def get_WordFrequencyController(self, number,testfilepath): + if number not in self.types: + self.types[number] = WordFrequencyController(number,testfilepath) # 创建新的对象 + print('new obj',number,'*'*30) + else: + print('ref obj','*'*30) + return self.types[number] # 重复使用已存在的对象 + + +if __name__ == "__main__": + factory = WordFrequencyControllerFactory() + for number in [ 1,3,5,3,5,7 ]: + WordFrequency = factory.get_WordFrequencyController(number,testfilepath) + WordFrequency.print_word_freqs() + \ No newline at end of file diff --git a/16 其它/对象设计模式/对象引用.py b/16 其它/对象设计模式/对象引用.py deleted file mode 100644 index 359d4b7..0000000 --- a/16 其它/对象设计模式/对象引用.py +++ /dev/null @@ -1,50 +0,0 @@ -''' -享元模式中,对象被设计为可共享的,被多个上下文使用,而不必在每个上下文中都创建新的对象。 -如果我们有大量不同的词频分析需求,有时需要词频前10的单词,有时需要词频前20的单词,有时还需要限定词汇的长度,那就需要创建多个词频统计器,每个词频统 -计器都独立创建并存储其内部状态,在这种情况下,享元模式共享相同类型的词频统计器对象,只需创建一个共享实例,然后通过设置不同的参数个性化每个对象,通过共享相同的内部状态,降低了对象的创建和内存占用成本。 -例如,我需要对3个文件获取词频前十的单词,对另外3个文件获取词频前二十的单词,那么我只需要创建2个词频统计器对象,每个对象存储相同的内部状态,一个对象 -获取前十的单词,一个对象获取前二十的单词,而不用创建6个对象 -''' - -from cppy.cp_util import * - - -#定义享元接口 -class WordFrequencyController(): - def print_word_freqs(self,number): - pass - -#定义具体的享元类 -class ConcreteWordFrequencyController(WordFrequencyController): - def __init__(self, controllertype,filepath): - self.word_list = extract_file_words(filepath) - self.word_freq = get_frequencies(self.word_list) - self.word_freq = sort_dict(self.word_freq) - def print_word_freqs(self, number): - print_word_freqs( self.word_freq,number) - -#定义享元工厂 -class WordFrequencyControllerFactory(): - def __init__(self): - self.types = {} - - def get_WordFrequencyController(self, controller_type,testfilepath): - if controller_type not in self.types: - self.types[controller_type] = ConcreteWordFrequencyController(controller_type,testfilepath) - #创建新的享元对象 - return self.types[controller_type]#重复使用已存在的享元对象 - -def process_command(factory: WordFrequencyControllerFactory, number: str): - controller_type = number - WordFrequencyController = factory.get_WordFrequencyController(controller_type,testfilepath) - WordFrequencyController.print_word_freqs(int(number)) - - -if __name__ == "__main__": - factory = WordFrequencyControllerFactory() - while True: - try: - number = input("请输入需要显示词频前几的单词: ") - process_command(factory, number) - except EOFError: - break \ No newline at end of file