zoukankan      html  css  js  c++  java
  • 【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()
  • 相关阅读:
    nginx 简单应用
    js判断图片是否存在
    Quartz Cron 生成工具
    c# 读写文件时文件正由另一进程使用,因此该进程无法访问该文件
    SQL Server 将某一列的值拼接成字符串
    EF 里的 join and Group Join
    .net EF Join 关联表分页查询
    IIS 设置文件可下载
    windows 2003 无法安装 .net4.0 windows服务
    NEST 增删改查
  • 原文地址:https://www.cnblogs.com/Tree0108/p/12116787.html
Copyright © 2011-2022 走看看