美文网首页
设计模式三刷(创建型)

设计模式三刷(创建型)

作者: 山猪打不过家猪 | 来源:发表于2023-02-07 16:57 被阅读0次

1.工厂模式

from abc import ABC,abstractmethod


class Payment(ABC):   
    @abstractmethod
    def _pay(self):
        pass

class AliPay(Payment):
    def _pay(self):
        print("Paying by Ali...")

class PaypalPay(Payment):
    def _pay(self):
        print("Pay by Paypal...")

#版本一:普通工厂
class OnlinePay_LOW:
    def creat_payment(self,method):
        if method =='alipay':
            return AliPay()
        elif method =='paypal':
            return PaypalPay()
        else:
            print("NO SUCH PAY METHOD!")

#版本二:依赖注入
class OnlinePay:
    def __init__(self,pay_method:Payment) -> None:
        self._pay_method = pay_method

    def pay_online(self):
        self._pay_method._pay()
        return
    
alipay =AliPay()
pay1 = OnlinePay(alipay)
pay1.pay_online()

  • 版本一:普通工厂实际用处不多,虽然它实现了解耦,但是里面有很多的if判断,所以不是很好,而且他也没有利用到多态。
  • 版本二:好处①不能直接使用各种支付方式的pay,更好的保护了代码②有一个OnlinePay的类,专门用于控制线上支付,使用方法也是pay_online,有利于代码控制

2. 工厂模式改进和重构

  • 上面版本二有个问题就是只有一个支付方法类,如果需要新的支付方式,就不支持,所以我们可以抽象出来一个支付方法类。这也体现了代码设计的原则:一般不要直接设计代码框架,而是从业务上出来设计
from abc import ABC,abstractmethod


class Payment(ABC):   
    @abstractmethod
    def _pay(self):
        pass


class AliPay(Payment):
    def _pay(self):
        print("Paying by Ali...")


class PaypalPay(Payment):
    def _pay(self):
        print("Pay by Paypal...")


class PayMethod(ABC):
    @abstractmethod
    def __init__(self,pay_method:Payment) -> None:
        self._pay_method = pay_method

    @abstractmethod
    def pay(self):
        pass


class OnlinePay(PayMethod):
    def __init__(self,pay_method:Payment) -> None:
        self._pay_method = pay_method

    def pay(self):
        print("Paying by Online...")
        self._pay_method._pay()
        return
    
class BankPay(PayMethod):
    def __init__(self,pay_method:Payment) -> None:
        self._pay_method = pay_method

    def pay(self):
        print("Paying by Bank...")
        self._pay_method._pay()
        return
    
alipay =AliPay()
pay_online = OnlinePay(alipay)
pay_Bank = BankPay(alipay)
pay_online.pay()
pay_Bank.pay()
  • 通过添加一个支付方法类,进行扩展,这样在以后有新的支付方法比如用比特币支付,只需要添加比特币支付类即可,其他地方都不用改动!

3.工厂类

  • 通过抽象一个工厂类,然后通过不同的工厂产生不同的类
from abc import ABC,abstractmethod


class Payment(ABC):   
    @abstractmethod
    def _pay(self):
        pass

class AliPay(Payment):
    def _pay(self):
        print("Paying by Ali...")

class PaypalPay(Payment):
    def _pay(self):
        print("Pay by Paypal...")

class PaymentFoctory(ABC):
    @abstractmethod
    def create_payment(self):
        pass

class AlipayFacotry(PaymentFoctory):
    def create_payment(self):
        return AliPay()

class PaypalPayFacotry(PaymentFoctory):
    def create_payment(self):
        return PaypalPay()


ali_pay_factory = AlipayFacotry()
ali_pay = ali_pay_factory.create_payment()
ali_pay._pay()

4.抽象工厂

pass

5. 建造者模式

  • 模式重点:有一个director来指挥创建类实现的顺序和步骤;如果需要更换步骤和逻辑,可以使用director 2,并且可以和工厂模式结合
from dataclasses import dataclass
from abc import ABC,abstractmethod

#产品1
@dataclass
class Player:
    face:str = None
    hair:str = None
    body:str = None

#产品2
@dataclass
class Player2:
    face:str = None
    hair:str = None
    body:str = None

#抽象建造者
class Builder(ABC):
    
    @abstractmethod
    def build_face(self):
        pass

    @abstractmethod
    def build_hair(self):
        pass    
    
    @abstractmethod
    def build_body(self):
        pass

#具体建造者1
class SexyGirl(Builder):
    
    def __init__(self) -> None:
        self.player = Player()

    def build_face(self):
        self.player.face = "baby face"
        return self 
     
    def build_hair(self):
        self.player.hair = "brown hair"     
        return self 
    
    def build_body(self):
        self.player.body = "hot body"
        return self 
    
#具体建造着2
class Monster(Builder):
    
    def __init__(self) -> None:
        self.player = Player()

    def build_face(self):
        self.player.body = "Monster face"
        return self 
    
    def build_hair(self):
        self.player.hair = "Monster hair"     
        return self ## 返回自己可以类似于java的链式调用
    
    def build_body(self):
        self.player.body = "Monster body"
        return self
    
#指挥者
class BuildDirector: ##控制顺序

    def build_charecher1(self,builder:Builder):
        builder.build_face().build_body().build_hair()
        return builder.player
    
    def build_charecher2(self,builder:Builder):
        builder.build_body().build_hair().build_face()
        return builder.player
    
sexy_girl = SexyGirl()
director = BuildDirector()
p = director.build_charecher2(sexy_girl)
print(vars(p)) #打印出p的所有方法
print(isinstance(p,Player)) #判断实例是否属于某个实例1
print(type(p) is Builder) #判断实例是否属于某个实例2
  • 重点
    链式调用
    判断成员
    获取所有属性的值

相关文章

  • 设计模式归纳

    一、设计模式的分类 23 种经典的设计模式分为三类:创建型、结构型、行为型。 1.创建型设计模式主要解决“对象的创...

  • 设计模式--分类

    一、设计模式的分类设计模式可以概括为23种,按照特点可以将其分为三大类型:创建型、结构型、行为型。1、创建型创建型...

  • 设计模式简单总结(待完善)

    设计模式简单总结 设计模式可以分为:创建型,结构型,行为型三种模式。 1 创建型模式 1.1 单例模式 用来指定某...

  • 单例模式

    单例 单例模式,是一种设计模式,属于创建型设计模式,还有一种创建型设计模式,工厂模式。设计模式总共有23种,三大类...

  • 开发之设计模式-单例模式

    设计模式 设计模式分为三大类:创建型、结构型、行为型在Java中有24中设计模式 创建型:单例 1、为什么用单例模...

  • 设计模式(行为型)-- 观察者模式

    我们常把 23 种经典的设计模式分为三类:创建型、结构型、行为型。创建型设计模式主要解决“对象的创建”问题,结构型...

  • 23种设计模式总结一

    23 种经典设计模式共分为 3 种类型,分别是创建型、结构型和行为型。 一、创建型设计模式 创建型设计模式包括:单...

  • PHP 设计模式

    PHP的设计模式可以分为三个大类 1. 创建型 在软件工程中,创建型设计模式是处理对象创建机制的设计模式,试图以适...

  • 设计模式之工厂模式

    设计模式中主要分为三大类:创建型、结构型、行为型 工厂模式属于创建型,顾名思义,创建型模式关注对象的创建过程,它将...

  • 设计模式

    设计模式主要分为三大类型:创建型模式,结构型模式和行为型模式 创建型设计模式是一类处理对象创建的设计模式,通过某种...

网友评论

      本文标题:设计模式三刷(创建型)

      本文链接:https://www.haomeiwen.com/subject/lrhfkdtx.html