设计模式:
程序中设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案;这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的;使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
1、单例模式
单例模式要保证只有一个对象;还要注意python中导入模块就是一种单例模式。
现在我们做一个练习,首先创建一个Sun类
class Sun(object):
# 定义一个变量
__instance=None
def __new__(cls, *args, **kwargs):
if not cls.__instance: # 如果_instance还没有值,就给__instance变量赋值
cls.__instance=object.__new__(cls)
return cls.__instance
else:
# 如果__instances 有值,则直接返回
return cls.__instance
sun=Sun()
print(id(sun))
sun1=Sun()
print(id(sun1))#sun和sun1的id值是相同的
我们再使用导入模块的方式创建单例对象:
首先建立一个单例模块singleton.py
class My_Singleton(object):
def foo(self):
pass
my_singleton=My_Singleton()
然后在建立一个py文件:
from singleton import my_singleton
my_singleton.foo()
print(id(my_singleton))
#运行后可以发现my_singleton是同一个对象,id地址相同
from singleton import my_singleton
my_singleton.foo()
print(id(my_singleton))
2、工厂模式
工厂模式是一个在软件开发中用来创建对象的设计模式。
当程序运行输入一个“类型”的时候,需要创建于此相应的对象;这就用到了工厂模式;在如此情形中,实现代码基于工厂模式,可以达到可扩展,可维护的代码。当增加一个新的类型,不在需要修改已存在的类,只增加能够产生新类型的子类。
使用工厂模式应用场景------>不知道用户想要创建什么样的对象
我们进行一个练习,创建一个工厂类来应用一下工厂模式加深理解
# 宝马类
class BMW():
def move(self):
print('---开,疾如风---')
def stop(self):
print('---刹,不动如山---')
# 奔驰类
class BENZ():
def move(self):
print('---开,疾如风---')
def stop(self):
print('---刹,不动如山---')
# 工厂类
class CarFactory():
#工厂方法
def CreatCar(self,typename):
if typename=='奔驰':
return BENZ()
elif typename=='宝马':
return BMW()
factory=CarFactory()
car=factory.CreatCar('奔驰')#创建奔驰类对象
print(type(car))
car.move()
car.stop()
3、策略模式
策略指的就是为了达到某一目的而采取的多种手段或者方法。
为了实现软件设计,对象可能会用到多种多样的算法(逻辑)。这些算法甚至会经常改变。如果将这些算法都硬编码到对象中,将会使得对象本身变得臃肿不堪,策略模式很好的实现了将算法与本身对象解耦,从而避免出现上述的问题。
因此策略模式可以定义为: 定义一系列算法(逻辑),将每一个算法封装起来(一个算法创建一个类),并让它们可以相互替换。此模式让算法的变化,不会影响到使用算法的客户.
策略模式的结构
策略模式包含以下3个角色:
Context(环境类)
Strategy(抽象策略类)
ConcreteStrategy(具体策略类)
现在通过练习加深理解|-。-|
假设某司维护着一些客户资料,
需要在该司有新产品上市或者举行新活动时通知客户。
现通知客户的方式有两种:电话通知、邮件通知。
应如何设计该系统的客户通知部分?
class Msg(object):#创建一个信息类
type = '' # 信息的方式,用来保存 电话号码或者邮箱地址
info = '' # 保存给客户发送的信息。
def send(self): pass
class Phone(Msg):#电话
def send(self):
print('给{}打电话说:{}'.format(self.type, self.info))
class Email(Msg):#邮件
def send(self):
print('给{}发送邮件内容是:{}'.format(self.type, self.info))
class Customer(object):#顾客
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 = '1234567'
customer.email = '1234567@qq.com'
# 打电话告诉选择一个name
phone = Phone()
phone.info = '新品上市啦,全场半价...'
phone.type = customer.phone # type = 110
customer.set_send_way(phone) # 设置发送的方式
customer.send_msg() # 发送信息
#如果想要改用邮件,换成Email即可