23种设计模式的几种常见的设计模式

单例模式 单利实现 class one(object):_instants=None 创建一个标记from threading import Lock

单例模式

单利实现

class one(object):
    _instants=None		#创建一个标记
    from threading import Lock		#导入
    lock=Lock()				#实例化锁
    def __new__(cls, *args, **kwargs):   #构建函数
        if not cls._instants:		#判断,如果没有构建空间
            with cls.lock:			
                cls._instants=super().__new__(cls)	#使用其父类空间
        return cls._instants	#并修改标记
    def __init__(self,name,age):
        self.name=name
        self.age=age

ret=one('luyi',18)
ret2=one('luer',18)
print(ret.name)
print(ret2.name)


思想:通过判断标记是否为NONE  来判断是否构建了空间,如果没有构建就使用父类的空间,如果构建了空间,则使用构建的空间(所以使用的一直是父类的空间)

单例模式是什么

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象

工厂模式

工厂模式应用场景

用户不需要知道创建什么样的类。
当你想要创建一个可扩展的关联在创建类与支持创建对象的类之间

工厂模式例子

我们有一个基类Person ,包涵获取名字,性别的方法 。(如果不实现方法就报错)
有两个子类male 和female,可以打招呼。
还有一个工厂类。
 工厂类有一个方法名getPerson有两个输入参数,名字和性别。
 用户使用工厂类,通过调用getPerson方法。
 
 在程序运行期间,用户传递性别给工厂,工厂创建一个与性别有关的对象。因此工厂类在运行期,决定了哪个对象应该被创建
class Person:
    def __init__(self):
        self.name = None
        self.gender = None

    def getName(self):
        return self.name

    def getGender(self):
        return self.gender

class Male(Person):
    def __init__(self, name):
        print "Hello Mr." + name

class Female(Person):
    def __init__(self, name):
        print "Hello Miss." + name

class Factory:
    def getPerson(self, name, gender):
        if gender == ‘M':
                return Male(name)
        if gender == 'F':
            return Female(name)


if __name__ == '__main__':
    factory = Factory()
    person = factory.getPerson("Chetan", "M")

工厂模式的好处

当程序运行输入一个“类型”的时候,需要创建于此相应的对象。这就用到了工厂模式。在如此情形中,实现代码基于工厂模式,可以达到可扩展,可维护的代码。当增加一个新的类型,不在需要修改已存在的类,只增加能够产生新类型的子类。

工厂模式在django中的实例

Django  settings 配置文件中的中间件以及所有以字符串格式的配置。都是通过导入importlib模块后通过反射导入。
这是工厂模式里的抽象工厂!!!

建造者模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

相关模式:思路和模板方法模式很像,模板方法是封装算法流程,对某些细节,提供接口由子类修改,建造者模式更为高层一点,将所有细节都交由子类实现

一个例子更能很好的理解以上的内容:

1. 有一个接口类,定义创建对象的方法。一个指挥员类,接受创造者对象为参数。两个创造者类,创建对象方法相同,内部创建可自定义

2.一个指挥员,两个创造者(瘦子 胖子),指挥员可以指定由哪个创造者来创造

修饰器模式

该模式虽名为修饰器,但这并不意味着它应该只用于让产品看起来更漂亮。修饰器模式通常用于扩展一个对象的功能。
def z_warper(s):
    def warper(func):
        def inner(*args,**kwargs):
            import time
            start_time=time.time()
            ret=func(*args,**kwargs)
            print('运行时间减一秒为:',time.time()-start_time-s,'秒')
            return ret
        return inner
    return warper

@z_warper(1)
def fuc():
    print("aaaa")
    return 'aaa'

fuc()

通过带参数的装饰器,在不改变函数本身的同时。给函数增加一个运行时间减1的功能

外观模式

外观模式又叫做门面模式。在面向对象程序设计中,解耦是一种推崇的理念。但事实上由于某些系统中过于复杂,从而增加了客户端与子系统之间的耦合度。例如:在家观看多媒体影院时,更希望按下一个按钮就能实现影碟机,电视,音响的协同工作,而不是说每个机器都要操作一遍。这种情况下可以采用外观模式,即引入一个类对子系统进行包装,让客户端与其进行交互。

外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。