设计模式——单例模式(python)
2019-10-20 本文已影响0人
周周周__
说到设计模式,作为初级开发者,感觉只会背几个常用得设计模式,对于其本身的原理并没有很好得理解。本栏记载在开发中遇到得设计模式,有感而发得记载。
在之前接触到设计模式名词得时候,并不晓得什么是设计模式,只会在面试前进行背诵一些简单的定义并没有深究,最近,我个人之前也仅是作为爬虫方面仅是数据实现,写一些简单得多线程也足够用。但是对于大型可控得爬虫应用场景中,不得不考虑一个整体系统得调度,这个时候,设计模式就显得尤为重要。
就目前接触常用的最多的还是单例模式和工厂模式
单例模式:
在编程模式中,大部分面向对象得编程中,用于创建本身对象给程序进行调用,主要是为了保证对象在创建的过程中,不会被频繁得创建和销毁。在程序运行的过程中,仅创建单个对象,保证资源的开销。在开发的过程中,我们可能经常遇到,但是我们不一定会意识到。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实)。
2、避免对资源的多重占用(比如写文件操作)。
应用的场景中,主要有计数器,日志等。本文会用日志来演示单例模式。
其实在py内部导包就是天生的单例模式。
当在开发大型项目的过程中,我们会将系统的单一功能会放在一个包中,比如数据库连接池和日志。
伪代码(举例说明单例,看着很简单,就是普通导包)
# loging.py
import logging
class Logger():
def __init__(self , logger = None):
pass
def getlog(self):
return self.logger
logger = Logger()#单例模式,其他对象调用接口
#test.py
from loging imort logger # 调用
pass
其中单例模式的实现方式还有其他的方法
比如:(后续详细完善)
1、类方法 2、装饰器 3、new方法4、元类
我现在只是想介绍懒汉和饿汉式。
饿汉式
单例模式是为了形成一个接口进行方便调用。最主观上我们能看到的就是我们在多次调用的时候看内存地址是否有变化。我们程序在运行得过程中,对象创建一般创建就不销毁,节省开销。
恶汉式就是一次创建接口后期直接用
。
如一个项目的如下
--blog
__init__.py
# 伪代码
from logging import logger
pass
--engin.py
--logging.py
--blog
log.log
--run.py
from blog import engin
engin.run()
我们在启动项目的时候,通过run.py进行启动。在blog中,初始化的__init__
在我们进行启动得时候就对logging包进行初始化。在我们项目在后期运行得过程中,只要需要就直接去调用(py中默认不会去重建)
懒汉式
懒汉式就是每次到用得时候才去创建它,不用就不创建
class Logger():
# 懒汉模式。使用的时候创建
_instance = None
def __init__(self):
if not hasattr(Logger, '_instance'):
pass
else:
self._instance
pass
@classmethod
def get_logger(cls):
if not cls._instance:
cls.instance = Logger()
return cls._instance
优点V缺点
饿汉
一次创建,比较方便,但是消耗系统资源(无伤大雅)
线程安全
懒汉
资源利用合理,使用时才创建
但是线程不安全,多次创建可能会创建不同的对象。线程加锁可以解决,但是又变慢了
`
建议使用饿汉式,方便好用