【python基础】单例模式 & 工厂模式 & 策略模式 & 观察者模式

一、单例模式

  单例:单个实例,确保某个类只有一个实例存在

  举例:1、登录app,当前的登录对象,只能有一个
     2、音乐播放器,正在播放的歌曲类而言,只能有一个实例

 1 import my_util   # 被导入的模块会从头到尾执行一遍
 2 
 3 o1 = my_util.a
 4 o2 = my_util.a
 5 o3 = my_util.a
 6 
 7 print(o1)
 8 print(o2)
 9 print(o3)
10 
11 
12 class Person:
13     __obj = None  # 单例
14 
15     def __new__(cls, *args, **kwargs):  # 创建实例对象 ---> 实例
16 
17         if not cls.__obj:
18             cls.__obj = super().__new__(cls)
19         return cls.__obj
20 
21     def __init__(self):  # 自己,本身; 谁调用谁就是self; 实际上,在调用init时, 实例对象已经被创建出来了;
22         pass
23 
24 
25 p1 = Person()  # 1. 调用new方法,创建实例对象, 开辟内存空间, 存储对象   2. 自动调用init方法
26 p2 = Person()
27 
28 print(p1)  # <__main__.Person object at 0x000000000269AA88>
29 print(p2)  # <__main__.Person object at 0x000000000269AA88>
30 
31 # print(Person.__obj)

二、工厂模式

  根据不同的条件, 创建不同的实例对象;

    汽车父类
      兰博基尼子类
      法拉利子类
      路虎子类

    工厂类
      方法:传入不同的钱,给你返回不同的汽车对象

    商场类
      属性:工厂对象
      方法:卖小汽车,通过工厂对象卖小汽车

 1 class Car:
 2     def run(self):
 3         print("车行驶")
 4 
 5     def stop(self):
 6         print("车制动")
 7 
 8 
 9 class Lamborghini(Car):
10     def run(self):
11         print("兰博基尼行驶")
12     def stop(self):
13         print("兰博基尼制动")
14 
15 
16 class Ferrari(Car):
17     def run(self):
18         print("法拉利行驶")
19     def stop(self):
20         print("法拉利制动")
21 
22 
23 class Land_rover(Car):
24     def run(self):
25         print("路虎行驶")
26     def stop(self):
27         print("路虎制动")
28 
29 
30 class Factory:
31     def get_money(self, money):
32         if money < 10:
33             return Land_rover()
34         elif money < 100:
35             return Ferrari()
36         else:
37             return Lamborghini()
38 
39 
40 class SuperMarket:
41     def __init__(self, f_obj):  # 参数: 工厂对象
42         self.f_obj = f_obj
43 
44     def sale_car(self, money):
45         return self.f_obj.get_money(money)
46 
47 
48 f = Factory()
49 # obj = f.get_money(9)
50 # obj.run()
51 # obj.stop()
52 
53 s = SuperMarket(f)
54 car = s.sale_car(115)
55 car.run()
56 car.stop()

三、策略模式 

  达到某个目标,有多种不同的方式,这些方式都有可能会使用到
  具体使用哪种方式,根据需求来定

 1 # 通知客户搞活动, 发邮件, 发短信;
 2 
 3 # 发送信息的父类
 4 class Msg:  # 信息的内容, 联系方式, 发送的方法
 5     def __init__(self, info, way):
 6         self.info = info
 7         self.way = way  # 1336669999 lixiaohua@offcn.com
 8 
 9     def send(self):
10         pass
11 
12 
13 # 发邮件
14 class Email(Msg):
15     def send(self):
16         return "用邮件的方式, 给{}发送活动信息: {}".format(self.way, self.info)
17 
18 
19 # 发短信
20 class ShortMsg(Msg):
21     def send(self):
22         return "用短信的方式, 给{}发送活动信息: {}".format(self.way, self.info)
23 
24 
25 class Customer:
26     def __init__(self, name, tel, email):
27         self.name = name
28         self.tel = tel
29         self.email = email
30         self.receive_way = None  # 接收信息的方式
31 
32     def receive_info(self):
33         return self.receive_way.send()
34 
35     def set_receive_way(self, obj):  # 设置接收信息的方式  obj可能是邮件对象, 也有可能是短信对象
36         self.receive_way = obj
37 
38 
39 customer = Customer("xixi", "13333333333", "lixiaohua@offcn.com")
40 
41 email = Email("周年庆,买一送一", customer.email)
42 short_msg = ShortMsg("周年庆,买一送一", customer.tel)
43 
44 customer.set_receive_way(short_msg)  # 设置接收信息的方式就是短信
45 print(customer.receive_info())

四、观察者模式

  小喇叭:一个人说,全校人听

  通知中心:校长用喇叭喊

  观察者:可以有n多个观察者,一直在监听通知

 1 # 通知中心(校长)
 2 class Monitor:
 3     observer_list = []  # 观察者列表
 4     info = ""  # 通知的内容
 5     name = ""  # 名字
 6 
 7     def set_observer(self, obj):  # 绑定观察者, 参数:观察者对象
 8         Monitor.observer_list.append(obj)
 9 
10     def show_info(self):  # 发布通知
11         for observer in Monitor.observer_list:  # 遍历获取每一个观察者
12             observer.receive_info()  # 调用观察者的接收信息的方法
13 
14 
15 # 观察者(学生)
16 class Student:
17 
18     def __init__(self, name, monitor):
19         self.name = name
20         self.monitor = monitor  # 通知中心
21 
22     def receive_info(self):
23         print("接收方:{}, {}发布了通知, 通知的内容为:{}".format(self.name, self.monitor.name, self.monitor.info))
24 
25 
26 m = Monitor()
27 Monitor.info = "今天开派对,时间是19:30"
28 Monitor.name = "xixi"
29 
30 s1 = Student("haha", m)
31 s2 = Student("hanhan", m)
32 
33 m.set_observer(s1)
34 m.set_observer(s2)
35 
36 m.show_info()
原文地址:https://www.cnblogs.com/Tree0108/p/12116787.html