python基础 常用的设计模式

1 单例模式

保证只有一个对象。

注意:在python中导入模块就是一种单例模式。

class Sun(object):
    #定义一个变量
    __instance = None

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            # 如果__instance还没有值,就给__intance变量赋值
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            #如果__instance有值 ,ze直接返回
            return cls.__instance

sun = Sun()  
print(id(sun))    #12322520
sun1 = Sun()
print(id(sun1))   #12322520

练习 2  优化练习1 的写法

class Sun(object):
    #定义一个变量
    __instance = None

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

sun = Sun()
print(id(sun))    #12322520
sun1 = Sun()
print(id(sun1))   #12322520

2 工厂模式

工厂模式是一个在软件开发中用来创建对象的设计模式。

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

使用工厂模式应用场景:

不知道用户想要创建什么样的对象

 

练习1 创建 CarFactory 工厂类

一般的思维模式:

class Car(object):
    def run(self):
        print('跑车。。。')
    def stop(self):
        print('停车。。。')

class BMW(Car):
    pass

class Benz(Car):
    pass

class CarStore(object):
    def order(self,name):
        if name == 'BMW':
            return BMW()
        if name == 'Benz':
            return Benz()

car_store = CarStore()
car = car_store.order('BMW')
car.run()
car.stop()
工厂模式 :

    def run(self):
        print('跑车。。。')
    def stop(self):
        print('停车。。。')

class BMW(Car):
    def run(self):
        print('宝马跑车。。。')
    def stop(self):
        print('宝马停车。。。')

class Benz(Car):
    def run(self):
        print('奔驰跑车。。。')
    def stop(self):
        print('奔驰停车。。。')

class CarFactory():
    def new_car(self,name):
        if name == 'BMW':
            bmw = BMW()
            return  bmw
        if name == 'Benz':
            benz = Benz()
            return benz

class CarStore(object):
    def __init__(self,factory):
        self.factory = factory

    def order(self,name):
        new_car = self.factory.new_car(name)
        return new_car

car_factory = CarFactory()
car_store = CarStore(car_factory)
car = car_store.order('Benz')
car.run()
car.stop()

3 策略模式

策略指的就是为了达到某一目的而采取的多种手段或者方法。

为了实现软件设计,对象可能会用到多种多样的算法(逻辑)。这些算法甚至会经常改变。如果将这些算法都硬编码到对象中,将会使得对象本身变得臃肿不堪,

策略模式很好的实现了将算法与本身对象解耦,从而避免出现上述的问题。

因此策略模式可以定义为: 定义一系列算法(逻辑),将每一个算法封装起来(一个算法创建一个类),并让它们可以相互替换。此模式让算法的变化,不会影响到使用算法的客户.

练习1:假设某司维护着一些客户资料,需要在该司有新产品上市或者举行新活动时通知客户。

现通知客户的方式有两种:短信通知、邮件通知。应如何设计该系统的客户通知部分?

为解决该问题,我们先构造客户类,包括客户常用的联系方式和基本信息,同时也包括要发送的内容。

#具体发送方式
class PhoneSender(MsgSender):
    def send(self):
        print('给{}打电话说:{}'.format(self.type,self.info))

class EmailSender(MsgSender):
    def send(self):
        print('给{}发邮件说:{}'.format(self.type, self.info))
#用户群体
class Customer(object):
    # def __init__(self,name,phone,email):
    name = ''
    phone = ''
    email = ''

    send_way = None   #发送方式

    def set_send_way(self,send_way):
        self.send_way = send_way

    def send_msg(self):
        self.send_way.send()

if __name__ == '__main__':
    # 创建用户
    customer = Customer()
    customer.name = 'zs'
    customer.phone = '110'
    customer.email = '[email protected]'

    #以电话访问形式发送
    phone_sender = PhoneSender()
    phone_sender.info = '快点呀  造作呀 新品上市了。。'
    phone_sender.type = customer.phone
    
    customer.set_send_way(phone_sender)  # 设置发送方式
    customer.send_msg()  # 发送信息
    
    #创建邮箱发送方式
    email_sender = EmailSender()
    email_sender.info = '欢迎看新产品'
    email_sender.type = customer.email

    customer.set_send_way(email_sender)  # 设置发送方式
    customer.send_msg()

猜你喜欢

转载自blog.csdn.net/weixin_44303465/article/details/86545724