设计模式介绍

  设计模式是经过总结、优化的,对我们经常会碰到的一些编程问题的可重用解决方案。一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码。反之,设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板。设计模式不会绑定具体的编程语言。一个好的设计模式应该能够用大部分编程语言实现(如果做不到全部的话,具体取决于语言特性)。最为重要的是,设计模式也是一把双刃剑,如果设计模式被用在不恰当的情形下将会造成灾难,进而带来无穷的麻烦。然而如果设计模式在正确的时间被用在正确地地方,它将是你的救星。

  起初,你会认为“模式”就是为了解决一类特定问题而特别想出来的明智之举。说的没错,看起来的确是通过很多人一起工作,从不同的角度看待问题进而形成的一个最通用、最灵活的解决方案。也许这些问题你曾经见过或是曾经解决过,但是你的解决方案很可能没有模式这么完备。

单例模式存在意义

模式特点:

保证类仅有一个实例,避免内存浪费,并提供一个访问它的全局访问点。

  1. 设计模式在所有语言内都是通用的
  2. 设计模式存在的意义就是让代码设计结构设计的更好

(程序如果并发量大的话,内存里就会存在非常多功能上一模一样的对象。存在这些对象肯定会消耗内存,对于这些功能相同的对象可以在内存中仅创建一个,需要时都去调用)

# 单例模式class Foo:__n = Nonedef __init__(self):self.name = "mosson"self.age = 18self.job = "pythoner"@staticmethoddef dl():if Foo.__n:return Foo.__nelse:Foo.__n = Foo()return Foo.__n# 创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.dl() 。f1 = Foo.dl()
print(f1)
f2 =Foo.dl()
print(f2)
f3 =Foo.dl()
print(f3)# 运行结果
<__main__.Foo object at 0x0000000001142390>
<__main__.Foo object at 0x0000000001142390>
<__main__.Foo object at 0x0000000001142390>

----------------------------------------------------------------------------------------------------

demo-1: 创建三个游戏人物分别是:

  • 苍井井,女,18,初始战斗力1000
  • 东尼木木,男,20,初始战斗力1800
  • 波多多,女,19,初始战斗力2500

class Person:def __init__(self, na, gen, age, fig):self.name = naself.gender = genself.age = ageself.fight =figdef grassland(self):"""注释:草丛战斗,消耗200战斗力"""self.fight = self.fight - 200# #####################  创建实例  #####################

cang = Person('苍井井', '女', 18, 1000)    # 创建苍井井角色
dong = Person('东尼木木', '男', 20, 1800)  # 创建东尼木木角色
bo = Person('波多多', '女', 19, 2500)      # 创建波多多角色

创建实例

demo-2:创建对数据库操作的公共类

# #### 定义类 ####class DbHelper(object):def __init__(self):self.hostname = '1.1.1.1'self.port = 3306self.password = 'pwd'self.username = 'root'def fetch(self):# 连接数据库# 拼接sql语句# 操作passdef create(self):# 连接数据库# 拼接sql语句# 操作passdef remove(self):# 连接数据库# 拼接sql语句# 操作passdef modify(self):# 连接数据库# 拼接sql语句# 操作pass# #### 操作类 ####

db = DbHelper()
db.create()

创建实例

装饰器方式单例模式

# 装饰器方式单例模式def singleton(argv):dic = {}def s(*args, **kwargs):if argv not in dic:dic[argv] = argv(*args, **kwargs)return dic[argv]else:return dic[argv]return s# 类上加单例装饰器
@singleton
class Foo:pass@singleton
class Foo2:pass

实例:结合场景二实现Web应用程序

#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_serverclass DbHelper(object):def __init__(self):self.hostname = '1.1.1.1'self.port = 3306self.password = 'pwd'self.username = 'root'def fetch(self):# 连接数据库# 拼接sql语句# 操作return 'fetch'def create(self):# 连接数据库# 拼接sql语句# 操作return 'create'def remove(self):# 连接数据库# 拼接sql语句# 操作return 'remove'def modify(self):# 连接数据库# 拼接sql语句# 操作return 'modify'class Handler(object):def index(self):# 创建对象db = DbHelper()db.fetch()return 'index'def news(self):return 'news'def RunServer(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])url = environ['PATH_INFO']temp = url.split('/')[1]obj = Handler()is_exist = hasattr(obj, temp)if is_exist:func = getattr(obj, temp)ret = func()return retelse:return '404 not found'if __name__ == '__main__':httpd = make_server('', 8001, RunServer)print "Serving HTTP on port 8001..."httpd.serve_forever()

Web应用程序实例 测试代码

对于上述实例,每个请求到来,都需要在内存里创建一个实例,再通过该实例执行指定的方法。

那么问题来了...如果并发量大的话,内存里就会存在非常多功能上一模一样的对象。存在这些对象肯定会消耗内存,对于这些功能相同的对象可以在内存中仅创建一个,需要时都去调用,也是极好的!!!

单例模式出马,单例模式用来保证内存中仅存在一个实例!!!

通过面向对象的特性,构造出单例模式:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_class ConnectionPoll:__instance = Nonedef __init__(self):self.ip = "1.1.1.1"self.port = 3306self.pwd = 123self.username = "root"self.conn_list = [1,2,3,4,5,6,7]@staticmethoddef get_instance():if ConnectionPoll.__instance:return ConnectionPoll.__instanceelse:ConnectionPoll.__instance = ConnectionPoll()return ConnectionPoll.__instanceobj1 = ConnectionPoll.get_instance()
print(obj1)
obj2 = ConnectionPoll.get_instance()
print(obj2)
obj2= ConnectionPoll.get_instance()
print(obj2)

通过面向对象的特性,构造出单例模式:

# ########### 单例类定义 ###########
class Foo(object):__instance = None@staticmethoddef singleton():if Foo.__instance:return Foo.__instanceelse:Foo.__instance = Foo()return Foo.__instance# ########### 获取实例 ###########
obj = Foo.singleton()

  对于Python单例模式,创建对象时不能再直接使用:obj = Foo(),而应该调用特殊的方法:obj = Foo.singleton() 。

这样多个人链接服务器访问地址就会只在内存中拿一份了

#!/usr/bin/env python
#coding:utf-8
from wsgiref.simple_server import make_server# ########### 单例类定义 ###########
class DbHelper(object):__instance = Nonedef __init__(self):self.hostname = '1.1.1.1'self.port = 3306self.password = 'pwd'self.username = 'root'@staticmethoddef singleton():if DbHelper.__instance:return DbHelper.__instanceelse:DbHelper.__instance = DbHelper()return DbHelper.__instancedef fetch(self):# 连接数据库# 拼接sql语句# 操作passdef create(self):# 连接数据库# 拼接sql语句# 操作passdef remove(self):# 连接数据库# 拼接sql语句# 操作passdef modify(self):# 连接数据库# 拼接sql语句# 操作passclass Handler(object):def index(self):obj =  DbHelper.singleton()print id(single)obj.create()return 'index'def news(self):return 'news'def RunServer(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])url = environ['PATH_INFO']temp = url.split('/')[1]obj = Handler()is_exist = hasattr(obj, temp)if is_exist:func = getattr(obj, temp)ret = func()return retelse:return '404 not found'if __name__ == '__main__':httpd = make_server('', 8001, RunServer)print "Serving HTTP on port 8001..."httpd.serve_forever()

Web应用实例-单例模式

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from wsgiref.simple_server import make_serverclass ConnectionPool:__instance = Nonedef __init__(self):self.ip = "1.1.1.1"self.port = 3306self.pwd = "123123"self.username = 'xxxx'# 去连接self.conn_list = [1,2,3,4,5,6,7,8,9, 10]@staticmethoddef get_instance():if ConnectionPool.__instance:return ConnectionPool.__instanceelse:# 创建一个对象,并将对象赋值给静态字段 __instanceConnectionPool.__instance = ConnectionPool()return ConnectionPool.__instancedef get_connection(self):# 获取连接import randomr = random.randrange(1,11)return rdef index():# p = ConnectionPool()# print(p)p = ConnectionPool.get_instance()conn = p.get_connection()return "fuck u bitch   " + str(conn)def news():return 'bitchbitchbitchbitch'def RunServer(environ, start_response):start_response(status='200 OK', headers=[('Content-Type', 'text/html')])url = environ['PATH_INFO']if url.endswith('index'):ret = index()return retelif url.endswith('news'):ret = news()return retelse:return "404"if __name__ == '__main__':httpd = make_server('', 8077, RunServer)print("Serving HTTP on port 8008...")httpd.serve_forever()

Web应用实例-单例模式

总结:单利模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!!!


多种样式的单利

1 使用__new__方法

class Singleton(object):def __new__(cls, *args, **kw):if not hasattr(cls, '_instance'):orig = super(Singleton, cls)cls._instance = orig.__new__(cls, *args, **kw)return cls._instanceclass MyClass(Singleton):a = 1

2 共享属性

创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.

class Borg(object):_state = {}def __new__(cls, *args, **kw):ob = super(Borg, cls).__new__(cls, *args, **kw)ob.__dict__ = cls._statereturn obclass MyClass2(Borg):a = 1

3 装饰器版本

def singleton(cls, *args, **kw):instances = {}def getinstance():if cls not in instances:instances[cls] = cls(*args, **kw)return instances[cls]return getinstance@singleton
class MyClass:...

转载于:https://www.cnblogs.com/mosson/p/5685667.html

设计模式----单利模式相关推荐

  1. 单利 java_Java设计模式-单利模式

    单例模式 作为对象的创建模式,单例模式确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类.单例模式有以下特点: 1.单例类只能有一个实例 2.单例类必须自己创建自己的 ...

  2. Java 设计模式之单利模式

    一.首先介绍一下单例模式:      单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全 ...

  3. 单利java_java设计模式之单利模式

    在我们做开发的时候,有些类的实例每次都new一个出来是没有必要的,因为它太占用内存咯.因此,单利模式有了它的用武之地了.最简单的单利模式如下: private static LogCatHelper ...

  4. 单利模式的优缺点和使用场景

    文章转自:http://www.tools138.com/create/article/20150929/020009847.html 单利模式的优缺点和使用场景 首先介绍一下单例模式:      单 ...

  5. 闭包和闭包下的单利模式

    闭包的基本语法 1. 有一个函数A 其中定义的需要保护的数据 2. 函数A return 的返回值 是一个匿名函数 3. 匿名函数程序 是操作执行 函数A 中被保护的数据 4. 在函数A 外 有变量存 ...

  6. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  7. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  8. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  9. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

最新文章

  1. 【爬蟲】使用Jsoup解析文档
  2. model里使用汉字页面崩掉
  3. java鼠标进入高亮效果_Javaweb 鼠标移入移出表格颜色变化的实现
  4. 还原oracle控制文件位置,oracle 11.2 控制文件还原
  5. 把项目通过maven生产源码包和文档包并发布到自己的私服上
  6. 关于WebBrowser(浏览器)控件的调用
  7. RS纠删码性能分析实战
  8. 好的vue框架-模板
  9. 组合导航(五):惯性导航参数建模
  10. 凯恩斯主义税收思想概述
  11. 手机web字体css设置,手机web字体css怎么设置微软雅黑
  12. 不用找了,这300家公司面试不考算法
  13. 中国杀软套路深:CIA怼遍全世界竟然干不过它
  14. uni-app项目起步
  15. 如何在Hi3559A上运行自己的YOLOv3模型
  16. 【百金轻】:油价跌势愈猛 投资者更不应做急单
  17. 【C Primer Plus第二章课后编程题】
  18. 基于RocketMQ设计秒杀
  19. 一个程序员的面试经历(一)
  20. html5背景图片铺满整个背景

热门文章

  1. Maya 交互式播放
  2. Python将txt数据写入excel【分列】
  3. 数学基础:和式极限(可爱因子理解) 连续,极限定义: 导数: 微积分: 推荐数学电影
  4. 小步快跑是这样玩的(下)
  5. 通讯模块 CI854AK01 3BSE030220R1
  6. js与php与mysql_PHP、MySQL和JavaScript入门经典(第6版)
  7. 戴尔G7音频驱动问题
  8. VIPKID前端面试题
  9. 关于Linux的本地回环路由lo [127.0.0.1 ]
  10. Android应用内安装apk包