享元模式Flyweight Pattern享元模式是一种结构型设计模式通过共享技术来支持大量细粒度对象的复用。它的核心思想是当系统中存在大量相同或相似的对象时只创建一个共享实例而不是为每个使用场景都创建新对象。核心概念内部状态Intrinsic State可以共享的、不变的状态存储在享元对象内部不随环境改变外部状态Extrinsic State不能共享的、变化的状态由客户端维护在使用时传递给享元对象实际应用示例: 文字处理器字符共享classCharacter:字符享元类def__init__(self,char,font_family,font_size):# 内部状态字符本身和字体属性self.charchar self.font_familyfont_family self.font_sizefont_sizedefdisplay(self,position_x,position_y): 显示字符 外部状态位置坐标 print(f字符 {self.char} [{self.font_family},{self.font_size}pt] f显示在位置({position_x},{position_y}))classCharacterFactory:字符工厂 - 负责创建和管理享元对象def__init__(self):self._characters{}defget_character(self,char,font_family,font_size):获取字符享元key(char,font_family,font_size)ifkeynotinself._characters:print(f创建新的字符对象:{char}({font_family},{font_size}pt))self._characters[key]Character(char,font_family,font_size)else:print(f复用已有字符对象:{char}({font_family},{font_size}pt))returnself._characters[key]defget_total_characters(self):获取创建的字符总数returnlen(self._characters)classTextEditor:文本编辑器 - 客户端def__init__(self):self.factoryCharacterFactory()self.text[]# 存储(字符享元, x, y)的列表definsert_text(self,text,font_family,font_size,start_x,start_y):插入文本x,ystart_x,start_yforcharintext:ifchar! :# 空格也处理但为了简洁这里忽略# 获取字符享元char_flyweightself.factory.get_character(char,font_family,font_size)# 存储字符和位置self.text.append((char_flyweight,x,y))xfont_size# 简单的字符间距计算else:xfont_size//2# 空格间距defdisplay_all(self):显示所有文本print(\n 文本内容 )forchar_flyweight,x,yinself.text:char_flyweight.display(x,y)deftext_editor_example():print( 文字处理器示例 )editorTextEditor()# 插入多行文本editor.insert_text(Hello,Arial,12,10,10)editor.insert_text(World,Arial,12,10,30)editor.insert_text(Hello,Times New Roman,14,10,50)editor.display_all()print(f\n总共创建的字符对象数:{editor.factory.get_total_characters()})print(f显示的字符总数:{len(editor.text)})if__name____main__:text_editor_example()
python--设计模式--13.1--结构性--享元模式
享元模式Flyweight Pattern享元模式是一种结构型设计模式通过共享技术来支持大量细粒度对象的复用。它的核心思想是当系统中存在大量相同或相似的对象时只创建一个共享实例而不是为每个使用场景都创建新对象。核心概念内部状态Intrinsic State可以共享的、不变的状态存储在享元对象内部不随环境改变外部状态Extrinsic State不能共享的、变化的状态由客户端维护在使用时传递给享元对象实际应用示例: 文字处理器字符共享classCharacter:字符享元类def__init__(self,char,font_family,font_size):# 内部状态字符本身和字体属性self.charchar self.font_familyfont_family self.font_sizefont_sizedefdisplay(self,position_x,position_y): 显示字符 外部状态位置坐标 print(f字符 {self.char} [{self.font_family},{self.font_size}pt] f显示在位置({position_x},{position_y}))classCharacterFactory:字符工厂 - 负责创建和管理享元对象def__init__(self):self._characters{}defget_character(self,char,font_family,font_size):获取字符享元key(char,font_family,font_size)ifkeynotinself._characters:print(f创建新的字符对象:{char}({font_family},{font_size}pt))self._characters[key]Character(char,font_family,font_size)else:print(f复用已有字符对象:{char}({font_family},{font_size}pt))returnself._characters[key]defget_total_characters(self):获取创建的字符总数returnlen(self._characters)classTextEditor:文本编辑器 - 客户端def__init__(self):self.factoryCharacterFactory()self.text[]# 存储(字符享元, x, y)的列表definsert_text(self,text,font_family,font_size,start_x,start_y):插入文本x,ystart_x,start_yforcharintext:ifchar! :# 空格也处理但为了简洁这里忽略# 获取字符享元char_flyweightself.factory.get_character(char,font_family,font_size)# 存储字符和位置self.text.append((char_flyweight,x,y))xfont_size# 简单的字符间距计算else:xfont_size//2# 空格间距defdisplay_all(self):显示所有文本print(\n 文本内容 )forchar_flyweight,x,yinself.text:char_flyweight.display(x,y)deftext_editor_example():print( 文字处理器示例 )editorTextEditor()# 插入多行文本editor.insert_text(Hello,Arial,12,10,10)editor.insert_text(World,Arial,12,10,30)editor.insert_text(Hello,Times New Roman,14,10,50)editor.display_all()print(f\n总共创建的字符对象数:{editor.factory.get_total_characters()})print(f显示的字符总数:{len(editor.text)})if__name____main__:text_editor_example()