Python中的单例,工厂模式,观察者模式,策略模式

本文深入讲解了四种设计模式:单例模式确保类只有一个实例;工厂模式提供创建对象的接口;观察者模式定义对象间的一对多依赖关系;策略模式封装算法,使它们可以互换。通过具体代码示例,展示了每种模式的实现方式及其应用场景。

单例

class A():
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,"instance"):
            cls.instance = object.__new__(cls)
        return cls.instance
    def __init__(self,num):
        self.num = num
a = A(5)
b = A(6)
print(a is b)      # True
print(a.num)      # 6
print(b.num)      # 6

工厂模式

class Bmw():
    def say(self):
        print("这是一辆宝马")
class Benchi():
    def say(self):
        print("这是一辆奔驰")
class Car():
    @classmethod
    def abc(cls,name):
        if name == "宝马":
            return Bmw()
        elif name == "奔驰":
            return Benchi()
a = Car.abc("宝马")
b = Car.abc("奔驰")
a.say()      # 这是一辆宝马
b.say()      # 这是一辆奔驰

观察者模式

class Boss():
    def __init__(self):
        self.obList = []
        self.msg = ""
    def attach(self,obj):
        self.obList.append(obj)
    def notify(self):
        for obj in self.obList:
            obj.update()
class Market():
    def __init__(self,name,boss):
        self.name = name
        self.boss = boss
    def update(self):
        print("市场部的{}您好,{}".format(self.name,self.boss.msg))
class Tech():
    def __init__(self,name,boss):
        self.name = name
        self.boss = boss
    def update(self):
        print("技术部的{}您好,{}".format(self.name,self.boss.msg))
boss = Boss()
zs = Market("张三", boss)
ls = Market("李四", boss)
ww = Tech("王五", boss)
boss.attach(zs)
boss.attach(ls)
boss.attach(ww)
boss.msg = "下午开会"
boss.notify()
# 运行结果
# 市场部的张三您好,下午开会
# 市场部的李四您好,下午开会
# 技术部的王五您好,下午开会

策略模式

class CashNormal():
    def getCashMoney(self, money):
        return money
class CashRate():
    def __init__(self, rate):
        self.rate = rate
    def getCashMoney(self, money):
        return money*self.rate
class CashReturn():
    def __init__(self, moneyCondition, moneyReturn):
        self.moneyCondition = moneyCondition
        self.moneyReturn = moneyReturn
    def getCashMoney(self, money):
        if money > self.moneyCondition:
            return money - (money//self.moneyCondition)*self.moneyReturn
        return money
class Oper():
    def __init__(self, cash):
        self.cash = cash
    def getCash(self, money):
        return self.cash.getCashMoney(money)
cashNormal = CashNormal()
cashRate = CashRate(0.8)
cashReturn = CashReturn(400,50)
a = Oper(cashNormal)
b = Oper(cashRate)
c = Oper(cashReturn)
money = int(input("请输入钱数"))
cl = int(input("请输入方案"))
if n == 1:
    print(a.getCash(money))
elif n == 2:
    print(b.getCash(money))
elif n == 3:
    print(c.getCash(money))
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值