目录
前言:
一、单例模式
二、工厂模式
三、策略模式
设计模式来源于建筑行业,中西方建筑各有自己的风格;每种风格都有自己的建筑方法(套 路);只要按照不同风格的建筑方法(套路)就能建成不同风格的建筑;简单的说设计模式就是一种(方法)套路;再比如肯德基麦当劳快餐店为什么全球的口味都一样呢?就是做食品的套路相同(炸鸡块多长时间都是固定的)。
程序中设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
保证只有一个对象。
注意:在python中导入模块就是一种单例模式。
练习1:创建Sun类
class People(object):
instance = None
def __new__(cls, *args, **kwargs):
if not cls.instance:
cls.instance = super().__new__(cls)
return cls.instance
else:
return cls.instance
per1 = People()
per2 = People()
# 没有重写new前,id不同
print(id(per1)) # 35113504
print(id(per2)) # 35113504
练习2:优化练习1写法
class People(object):
instance = None
def __new__(cls, *args, **kwargs):
if not cls.instance:
cls.instance = super().__new__(cls)
return cls.instance
per1 = People()
per2 = People()
# 没有重写new前,id不同
print(id(per1)) # 41798176
print(id(per2)) # 41798176
练习3:使用导入模块的方式创建单例对象。
from singleton单例 import sun
print(id(sun)) # 35555480
from singleton单例 import sun
print(id(sun)) # 35555480
工厂模式是一个在软件开发中用来创建对象的设计模式。
当程序运行输入一个“类型”的时候,需要创建于此相应的对象。这就用到了工厂模式。在如此情形中,实现代码基于工厂模式,可以达到可扩展,可维护的代码。当增加一个新的类型,不在需要修改已存在的类,只增加能够产生新类型的子类。
使用工厂模式应用场景:
不知道用户想要创建什么样的对象
练习1:创建CarFactory工厂类。
class Car(object):
def run(self):
print('so~so~de')
def stop(self):
print('ci~~~~')
class BMW(Car):
pass
class Benz(Car):
pass
class CarFactory(object):
def make_car(self,name):
if name == 'BMW':
return BMW()
if name == 'Benz':
return Benz()
factory = CarFactory()
car = factory.make_car('BMW')
print(type(car)) #
策略指的就是为了达到某一目的而采取的多种手段或者方法。
为了实现软件设计,对象可能会用到多种多样的算法(逻辑)。这些算法甚至会经常改变。如果将这些算法都硬编码到对象中,将会使得对象本身变得臃肿不堪,
策略模式很好的实现了将算法与本身对象解耦,从而避免出现上述的问题。
因此策略模式可以定义为: 定义一系列算法(逻辑),将每一个算法封装起来(一个算法创建一个类),并让它们可以相互替换。此模式让算法的变化,不会影响到使用算法的客户.
策略模式的结构
策略模式包含以下3个角色:
Context(环境类)
Strategy(抽象策略类)
ConcreteStrategy(具体策略类)
练习1:假设某司维护着一些客户资料,需要在该司有新产品上市或者举行新活动时通知客户。现通知客户的方式有两种:短信通知、邮件通知。应如何设计该系统的客户通知部分?为解决该问题,我们先构造客户类,包括客户常用的联系方式和基本信息,同时也包括要发送的内容。
# 抽象策略类
class MsgSender(object):
type = '' # 通知方式,用来保存电话号码或者邮箱地址
info = '' # 保存通知的内容
def send(self):
pass
# 具体策略类
class PhoneSend(MsgSender):
def send(self):
print('给{}打电话说:{}'.format(self.type, self.info))
# 具体策略类
class EmailSend(MsgSender):
def send(self):
print('给{}发邮件内容:{}'.format(self.type, self.info))
# 环境类
class Customer(object):
name = ''
tel = ''
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 = '六六'
customer.tel = '111'
customer.email = '555@'
# 打电话通知
phone_send = PhoneSend()
customer.set_send_way(phone_send)
phone_send.type = customer.name
phone_send.info = '你迟到了!罚款200元'
customer.send_msg() # 给六六打电话说:你迟到了!罚款200元
# 发短信
email_send = EmailSend()
customer.set_send_way(email_send)
email_send.type = customer.name
email_send.info = '你迟到了!罚款200元'
customer.send_msg() # 给六六发邮件内容:你迟到了!罚款200元