python中的设计模式

目录

 1、单例模式

练习1:创建Sun类

练习2:使用导入模块的方式创建单例对象。

2、工厂模式

举例:创建汽车工厂类。

3、策略模式

练习1:通知客户


设计模式来源于建筑行业,中西方建筑各有自己的风格;每种风格都有自己的建筑方法(套 路);只要按照不同风格的建筑方法(套路)就能建成不同风格的建筑;简单的说设计模式就是一种(方法)套路;再比如肯德基麦当劳快餐店为什么全球的口味都一样呢?就是做食品的套路相同(炸鸡块多长时间都是固定的)。

程序中设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

 1、单例模式

保证只有一个对象。

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

 

练习1:创建Sun类

class Sun(object):
    count = None

    def __new__(cls, *args, **kwargs):
        if not cls.count:
            cls.count = super().__new__(cls)
        return cls.count


sun1 = Sun()
print(id(sun1))
sun2 = Sun()
print(id(sun2))

输出为:

42715008
42715008

如上代码所示,我们使用了__new__方法,使Sun类只能有一个对象

练习2:使用导入模块的方式创建单例对象。

先创建一个模块

from singleton import sun

print(id(sun))
# 42977152


from singleton import sun

print(id(sun))
# 42977152

然后添加代码导入这个模块的对象两次,可以看到,这个对象虽然被调用了两次,但是它的ID值是一样的,其实是一个对象

 

2、工厂模式

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

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

 

使用工厂模式应用场景:

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

举例:创建汽车工厂类。

我们买车是去4S店里买,但是4S店本身不生产车,他接到订单后,需要发送到工厂,然后工厂生产,然后4S店通知我们提车

class Car(object):
    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(object):
    def new_car(self, name):
        if name == 'BMW':
            return BMW()
        if name == 'Benz':
            return Benz()


class CarStore(object):

    def __init__(self, factory):
        self.factory = factory

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


car_factory = CarFactory()
car_store = CarStore(car_factory)
car1 = car_store.order('BMW')
car1.run()
car1.stop()
# 如果要新增另一种车,例如奔驰,则只需要添加一个车的子类并加入工厂就行
# car2 = car_store.order('Benz')
# car2.run()
# car2.stop()

3、策略模式

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

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

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

 

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

策略模式的结构

策略模式包含以下3个角色:

Context(环境类)

Strategy(抽象策略类)

ConcreteStrategy(具体策略类)

 

练习1:通知客户

假设某司维护着一些客户资料,需要在该司有新产品上市或者举行新活动时通知客户。现通知客户的方式有两种:短信通知、邮件通知。应如何设计该系统的客户通知部分?为解决该问题,我们先构造客户类,包括客户常用的联系方式和基本信息,同时也包括要发送的内容。

class MsgSender(object):
    type = ''  # 信息的方式,用来保存电话号码或者邮箱地址
    info = ''  # 保存给客户发送的信息

    def send(self): pass


class PhoneInform(MsgSender):

    def send(self):
        print('给{}打电话说:{}'.format(self.type, self.info))


class EmailInform(MsgSender):

    def send(self):
        print('给{}发送邮件,内容是:{}'.format(self.type, self.info))


class Customer(object):
    name = ''  # 姓名
    phone = ''  # 电话
    email = ''  # 邮件

    send_way = None  # 发送方式

    # 设置发送方式:
    def set_send_way(self, way):
        self.send_way = way

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


if __name__ == '__main__':
    customer = Customer()
    customer.name = 'lee'
    customer.phone = '123'
    customer.email = '123@qq.com'

    # 打电话
    phone_inform = PhoneInform()
    phone_inform.info = '亲,新品上市!'
    phone_inform.type = customer.name
    customer.set_send_way(phone_inform)
    customer.send_msg()

输出为:

给lee打电话说:亲,新品上市!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值