Python设计模式-享元模式
Python设计模式-享元模式
基于Python3.5.2,代码如下
1 #coding:utf-8 2 3 class Coffee: 4 name = "" 5 price = 0 6 def __init__(self,name): 7 self.name = name 8 self.price = len(name) 9 def show(self): 10 print("Coffee Name:%s Price:%s"%(self.name,self.price)) 11 class Customer: 12 name = "" 13 coffee_factory = "" 14 def __init__(self,name,coffee_factory): 15 self.name = name 16 self.coffee_factory = coffee_factory 17 def order(self,coffee_name): 18 print("%s order a cup of coffee:%s" % (self.name, coffee_name)) 19 return self.coffee_factory.getCoffee(coffee_name) 20 21 class CoffeeFactory(): 22 coffee_dict = {} 23 def getCoffee(self,name): 24 if self.coffee_dict.get(name,False) == False: 25 self.coffee_dict[name] = Coffee(name) 26 return self.coffee_dict[name] 27 def getCoffeeCount(self): 28 return len(self.coffee_dict) 29 30 if __name__ == "__main__": 31 coffee_factory = CoffeeFactory() 32 customer1 = Customer("Client 1",coffee_factory).order("coffee1") 33 customer2 = Customer("Client 2", coffee_factory).order("coffee1") 34 customer3 = Customer("Client 3", coffee_factory).order("coffee2") 35 customer4 = Customer("Client 4", coffee_factory).order("coffee3") 36 print("CoffeeFactory中coffee的实例对象数",coffee_factory.getCoffeeCount())
享元模式分析与解读
享元模式
运用共享技术有效支持大量细粒度对象。在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部对象,而随环境改变而改变的、不可以共享的状态就是外部状态了。享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本相同的,有时就能够大幅度减少需要实例化的类的数量,如果能把这些参数移到类实例的外面,在方法调用时将他们传递进来,就可以通过共享大幅度减少单个实例的数目。
享元模式的适用场景
1、系统中存在大量的相似对象时,可以选择享元模式; 2、需要缓冲池的场景中,如进程池、线程池等技术。
解读
代码中,模拟了不同用户来下订单购买咖啡的场景,咖啡店中可供选择的咖啡类型有限,由于顾客每个都不同,在生成订单买咖啡时,需要生成咖啡实例,如果同一个种类咖啡被不同顾客订购时,会生成多个实例,此时就应用享元模式对该场景应用进行改造。 1、在Coffee类中,包含了Coffee的名称和价格; 2、用CoffeeFactory类来管理Coffee类,类通过getCoffee()来确保同一个种类的Coffee只生成一次。 3、在Customer类中,初始化时将CoffeeFactory对象传入,当Customer调用order()方法时,通过CoffeeFactory对象的getCoffee()方法来获得Coffee对象,从而达到对象共享的目的。 程序运行结果如下: Client 1 order a cup of coffee:coffee1 Client 2 order a cup of coffee:coffee1 Client 3 order a cup of coffee:coffee2 Client 4 order a cup of coffee:coffee3 CoffeeFactory中coffee的实例对象数 3 通过运行结果,显示工厂类中只生成了三个coffee对象,不同的顾客实现了对coffee对象的共享。
享元模式的优缺点
优点:
1、减少重复对象,节约系统资源。
缺点:
1、虽然节约了系统资源,但同时也提高了系统的复杂性,尤其当遇到外部状态与内部状态混在一起时,需要先将其分离,再使用享元模式。 2、享元模式需要注意线程安全问题。
备注
class Flyweight(): def operation(self): raise NotImplementedError class ConcreteFlyweight(Flyweight): def operation(self): print("实现operation") class FlyweightFactory(): flyweights = {} def __init__(self): self.flyweights["A"] = ConcreteFlyweight() self.flyweights["B"] = ConcreteFlyweight() self.flyweights["C"] = ConcreteFlyweight() def getFlyweight(self,key): return self.flyweights[key] if __name__ == "__main__": f = FlyweightFactory() fa = f.getFlyweight("A") fa.operation() fb = f.getFlyweight("B") fb.operation() 该实现方式,对不同的语言具有通用性。
版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
https://www.cnblogs.com/qq_841161825/

浙公网安备 33010602011771号