#享元模式是用于优化的 #是创建大量重复单元,不在意单个ID的,就是说,他们的ID是不区分的 #比如说创建一万颗树,第一次可以创建,接下来就不用再开辟内存了,直接寻找,找到就返回创建 import random from enum import Enum TreeType=Enum("TreeType",("apple","cherry","peach")) class Tree: pool={} #数目池 def __new__(cls,tree_type): obj=cls.pool.get(tree_type,None) #获取树苗类型 if not obj: #如果之前没有创建过 obj=object.__new__(cls) #开辟一块内存空间 cls.pool[tree_type]=obj #在池子里添加这个树苗类型和他的内存空间 obj.tree_type=tree_type #内存空间里添加树苗类型 return obj #返回树苗类型空间 def render(self,age,x,y): print("创建了一个新的种类{}的树苗,他的年龄是{},地点位于{},{}".format( self.tree_type,age,x,y )) def main(): rnd=random.Random() age_min,age_max=1,30 #树苗年龄在1-30之间随机 min_point,max_point=0,100 #随机地点 tree_counter=0 print(rnd) for _ in range(10): #10个苹果树 t1=Tree(TreeType['apple']) t1.render(rnd.randint(age_min,age_max), rnd.randint(min_point,max_point), rnd.randint(min_point, max_point)) tree_counter+=1 for _ in range(3): #3个cherry树 t2=Tree(TreeType['cherry']) t2.render(rnd.randint(age_min,age_max), rnd.randint(min_point,max_point), rnd.randint(min_point, max_point)) tree_counter+=1 for _ in range(5): #5个peach树 t3=Tree(TreeType['peach']) t3.render(rnd.randint(age_min,age_max), rnd.randint(min_point,max_point), rnd.randint(min_point, max_point)) tree_counter+=1 print("树苗创建了{}个".format(tree_counter)) print("树苗完成创建:{}种类".format(len(Tree.pool))) t4=Tree(TreeType['cherry']) t5 = Tree(TreeType['cherry']) t6=Tree(TreeType['apple']) print("{}----{}是同一颗树吗? {}".format(id(t4),id(t5),id(t4)==id(t5))) print("{}----{}是同一颗树吗? {}".format(id(t5), id(t6), id(t6) == id(t5))) if __name__ == '__main__': main()
python享元模式
最新推荐文章于 2024-02-25 16:04:58 发布