要保证多线程中构建的实例对象为单例,需要在 __new__ 函数中使用 threading.Lock() 加入同步锁
class Singleton(object):
“”"
实例化一个对象
“”"
锁
_instance_lock = threading.Lock()
def init(self):
pass
def new(cls, *args, **kwargs):
if not hasattr(Singleton, “_instance”):
with Singleton._instance_lock:
if not hasattr(Singleton, “_instance”):
Singleton._instance = object.new(cls)
return Singleton._instance
使用的时候,在线程任务中实例化对象,运行线程即可
def task(arg):
“”"
任务
:param arg:
:return:
“”"
instance = Singleton()
print(id(instance), ‘\n’)
if name == ‘main’:
3个线程
for i in range(3):
t = threading.Thread(target=task, args=[i, ])
t.start()
这样,就保证了多线程创建的实例是单例存在的,不会导致脏数据!
2. 工厂模式
以生产3种水果对象为例,定义 3 类水果,分别是:苹果、香蕉、橘子
定义一系列水果
class Apple(object):
“”“苹果”""
def repr(self):
return “苹果”
class Banana(object):
“”“香蕉”""
def repr(self):
return “香蕉”
class Orange(object):
“”“橘子”""
def repr(self):
return
“橘子”
工厂模式包含:简单工厂、工厂方法、抽象工厂
第 1 种,简单工厂
简单工厂是最常见的工厂模式,适用于简单的业务场景
首先,定义一个工厂类,创建一个静态方法,根据输入的类型,返回不同的对象
class FactorySimple(object):
“”“简单工厂模式”""
@staticmethod
def get_fruit(fruit_name):
if ‘a’ == fruit_name:
return Apple()
elif ‘b’ == fruit_name:
return Banana()
elif ‘o’ == fruit_name:
return Orange()
else:
return ‘没有这种水果’
使用方式如下:
if name == ‘main’:
分别获取3种水果
输入参数,通过简单工厂,返回对应的实例
instance_apple = FactorySimple.get_fruit(‘a’)
instance_banana = FactorySimple.get_fruit(‘b’)
instance_orange = FactorySimple.get_fruit(‘o’)
第 2 种,工厂方法
工厂方法将创建对象的工作让相应的工厂子类去实现,保证在新增工厂类时,不用修改原有代码
首先,创建一个抽象公共工厂类,并定义一个生产对象的方法
import abc
from factory.fruit import *
class AbstractFactory(object):
“”“抽象工厂”""
metaclass = abc.ABCMeta
@abc.abstractmethod
def get_fruit(self):
pass
接着,创建抽象工厂类的 3 个子类,并重写方法,创建一个实例对象并返回
class AppleFactory(AbstractFactory):
“”“生产苹果”""
def get_fruit(self):
return Apple()
class BananaFactory(AbstractFactory):
“”“生产香蕉”""
def get_fruit(self):
return Banana()
class OrangeFactory(AbstractFactory):
“”“生产橘子”""
def get_fruit(self):
return Orange()
最后的使用方式如下:
if name == ‘main’:
每个工厂负责生产自己的产品也避免了我们在新增产品时需要修改工厂的代码,而只要增加相应的工厂即可
instance_apple = AppleFactory().get_fruit()
instance_banana = BananaFactory().get_fruit()
instance_orange = OrangeFactory().get_fruit()
print(instance_apple)
print(instance_banana)
print(instance_orange)
第 3 种,抽象工厂
如果一个工厂要生产多个产品,使用工厂方法的话,就需要编写很多工厂类,不太实用,使用抽象工厂就可以很好的解决这个问题
以川菜馆和湘菜馆炒两个菜,毛血旺和小炒肉为例
首先,创建川菜毛血旺、川菜小炒肉、湘菜毛血旺、湘菜小炒肉 4 个类
class MaoXW_CC(object):
“”“川菜-毛血旺”""
def str(self):
return “川菜-毛血旺”
class XiaoCR_CC(object):
“”“川菜-小炒肉”""
def str(self):
return “川菜-小炒肉”
class MaoXW_XC(object):
“”“湘菜-毛血旺”""
def str(self):
return “湘菜-毛血旺”
class XiaoCR_XC(object):
“”“湘菜-小炒肉”""
def str(self):
return “湘菜-小炒肉”
然后,定义一个抽象工厂类,内部定义两个方法,可以生成毛血旺和小炒肉
class AbstractFactory(object):
“”"
抽象工厂
既可以生产毛血旺,也可以生成小炒肉
“”"
metaclass = abc.ABCMeta
@abc.abstractmethod
def product_maoxw(self):
pass
@abc.abstractmethod
def product_xiaocr(self):
pass
接着,创建抽象工厂类的两个子类,川菜工厂和湘菜工厂,重写方法,然后创建对应的实例对象返回
class CCFactory(AbstractFactory):
“”“川菜馆”""
def product_maoxw(self):
return MaoXW_CC()
def product_xiaocr(self):
return XiaoCR_CC()
class XCFactory(AbstractFactory):
“”“湘菜馆”""
def product_maoxw(self):
return MaoXW_XC()
def product_xiaocr(self):
return XiaoCR_XC()
最后,使用川菜工厂和湘菜工厂分别炒两个菜
if name == ‘main’:
川菜炒两个菜,分别是:毛血旺和小炒肉
maoxw_cc = CCFactory().product_maoxw()
xiaocr_cc = CCFactory().product_xiaocr()
print(maoxw_cc, xiaocr_cc)
maoxw_xc = XCFactory().product_maoxw()
xiaocr_xc = XCFactory().product_xiaocr()
print(maoxw_xc, xiaocr_xc)
3. 构建者模式
构建者模式,是将一个复杂对象的构造与表现进行分离,利用多个步骤进行创建,同一个构建过程可用于创建多个不同的表现
简单来说,就是将一个复杂对象实例化的过程,按照自己的想法,一步步设置参数,定制一个我们需要的对象
构建者模式一般由 Director(指挥官)和 Builder(建设者)构成
其中:
Builder 用于定义目标对象部件的方法和参数
Director 用于构造一个 Builder 的接口,由 Director 去指导 Builder 生成一个复杂的对象
以购买一辆车( 包含:准备钱、看车、试驾、购买 4 个步骤)为例
首先,定义一个车的实体,并定义属性变量
class Car(object):
def init(self):
准备的钱
self.money = None
去哪里看车
self.address = None
试驾什么车
self.car_name = None
购买时间是
self.buy_time = None
def str(self):
return “准备了:%s,去%s看车,试驾了%s,下单了,购买时间是:%s” % (self.money, self.address, self.car_name, self.buy_time
然后,创建一个 Builder,实例化一个 Car 对象;针对上面 4 个步骤,通过定义 4 个方法
分别是:准备多少钱、去哪里看车、试驾什么车、下单购买的时间
创建者
class CarBuilder(object):
def init(self):
self.car = Car()
def ready_money(self, money):
“”"
准备的金额
:param money:
:return:
“”"
self.car.money = money
sleep(0.5)
return self
def see_car(self, address):
“”"
去哪里看车
:param address:
:return:
“”"
self.car.address = address
sleep(0.5)
return self
def test_drive(self, car_name):
“”"
试驾了什么车
:param car_name:
:return:
“”"
self.car.car_name = car_name
sleep(0.5)
return self
def buy_car(self, buy_time):
“”"
下单时间
:param buy_time:
:return:
“”"
self.car.buy_time = buy_time
sleep(0.5)
return self
接着,创建 Director,创建 build 方法,使用 Builder 一步步构建一个车对象并返回
class Director(object):
def init(self):
self.builder = None
def build(self, builder):
self.builder = builder
self.builder. \
ready_money(“100万”). \
see_car(“4S店”). \
test_drive(“奥迪Q7”). \
buy_car(“2020年8月1日”)
最后
Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
👉Python所有方向的学习路线👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉Python必备开发工具👈
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
👉Python全套学习视频👈
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
👉实战案例👈
学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。
因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。
👉大厂面试真题👈
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
png)
👉Python必备开发工具👈
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
👉Python全套学习视频👈
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
👉实战案例👈
学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。
因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。
👉大厂面试真题👈
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。