代码环境:python3.6单例模式单例模式,可以保证某个类只有一个实例存在。fromthreadingimportThread,LockclassSingleton:"""Thread-safesingletonpattern"""_instance_lock=Lock()_init_lock=Lock()def__new__(cls,*args,**kwargs):#确保只有一个实例withSingleton._instance_lock:ifnothasattr(Singleton,'_instance'):print('firstnew')Singleton._instance=object.__new__(cls)returnSingleton._instancedef__init__(self):#运行initwithSingleton._init_lock只有一次:如果不是hasattr(Singleton,'_first_init'):print('first_init')Singleton._first_init=Truedeftask(i):obj=Singleton()print(f'Thread-{i}:{obj}')if__name__=="__main__":foriinrange(10):t=Thread(target=task,args=(i,))t.start()装饰器模式我们可以通过多种方式来扩展额外的功能一个对象,装饰器模式就是其中之一。在很多编程语言中,装饰器模式都是通过继承来实现的,在python中可以使用内置的装饰器功能。需要注意的是,实现装饰器模式只是python装饰器的一种用法,而python装饰器实际上可以做的远不止装饰器模式。关于python装饰器的更多介绍,有兴趣的朋友可以看我的另一篇文章:python中的装饰器工厂模式工厂模式就是我们可以通过一个指定的“工厂”来获取需要的“产品”。这种模式下,用户只需要通过固定的接口获取对象实例,而不是直接调用类的实例化方法,隐藏了实例创建过程的复杂性,解耦了生产实例和使用实例的代码,减少了维护的复杂性。1.简单工厂模型假设我们有一个简单的汽车工厂,只生产奔驰和宝马两种汽车:classBenz:"""Benz"""def__repr__(self):return'ThisisBenz'classBMW:"""BMW"""def__repr__(self):return'ThisisBMW'classCarFactory:"""根据类型生产汽车的简单工厂"""defproduce_car(self,typename):iftypename=='benz':returnBenz()eliftypename=='bmw':returnBMW()defmain():"""有了上面这个简单的工厂类,我们就可以通过给固定接口传参得到想要的汽车对象"""car_factory=CarFactory()car1=car_factory。produce_car('benz')car2=car_factory.produce_car('bmw')print(f'car1:{car1}')print(f'car2:{car2}')if__name__=="__main__":main()2.工厂??方法模式我们上面有一个简单的工厂,但是如果我们要添加一个新的产品Audi,除了添加一个新的Audi类之外,还需要修改CarFactory的produce_car方法,不利于以后的扩展。所以我们在简单工厂的基础上抽象出不同的工厂,每个工厂生产自己的产品。这就是工厂方法。奔驰类:“”“Benz”“”def__repr__(self):返回“这是奔驰”类BMW:“”“BMW”“”def__repr__(self):返回“这是BMW”类AbsFactory:“””Abstractfactory"""defproduce_car(self):#只定义方法,不实现,具体功能在子类中实现passclassBenzFactory(AbsFactory):"""BenzFactory"""defproduce_car(self):returnBenz()classBMWFactory(AbsFactory):"""BMWFactory"""defproduce_car(self):returnBMW()defmain():"""我们可以通过特定的工厂获取特定的产品"""car1=BenzFactory().produce_car()car2=BMWFactory().produce_car()print(f'car1:{car1}')print(f'car2:{car2}')if__name__=="__main__":main()原型模式原型模式帮助我们创建一个对象的克隆。在最简单的版本中,原型模式只是一个克隆函数,它将一个对象作为参数并返回该对象的克隆。python中没有提到原型模式,因为已经内置了copy.deepcopy函数。
