首页 > 编程语言 >常用设计模式(Python版)

常用设计模式(Python版)

时间:2022-08-23 19:11:44浏览次数:85  
标签:常用 render Python self animal 设计模式 class def

1. 设计模式是什么?有什么用?

设计模式是软件开发过程中经过验证的、用于解决特定环境下、重复出现的、特定问题的解决方案。

根据GoF(Gang Of Four),设计模式被分为三类:

  • 创建型模式

     -->抽象了对象实例化的过程,用来帮助创建对象的实例。

  • 结构型模式

     -->描述如何组合类和对象以获得更大的结构。

  • 行为型模式

     -->描述算法和对象间职责的分配。

在很多面向对象语言的框架中(尤其是Java),到处可以看到运用设计模式的影子。设计模式已经成为软件开发人员的标准词汇,学习设计模式可以避免重复造轮子(毕竟这些模式是高手总结出来的经验,我们学会即可),也是个人技术能力提升的途径。

虽然是模式可以照搬,但最好还是结合场景,活学活用。活学活用建立在对设计模式深入的认知和不断地运用实践,从知到行还是需要一个过程的。

实践是检验掌握知识的唯一标准,本人比较熟悉Python,这里只展示如何使用Python来实现,至于其他语言,可以参考网上其他资料,或者是下面这个网站:设计模式目录

2. 设计模式的几个基本原则

2.1 单一职责原则

单一职责实质上要求我们要解耦:让一个类只负责一件事情。多个类然后通过组合实现某个具体业务。也是KISS(Keep It Simple)思想的一种体现。

2.2 开闭原则

开闭原则是指导我们对代码进行扩展的原则:一个类应该对扩展开放,对修改关闭。开闭原则需要我们思考出哪些是经常变化的、哪些不是,然后将它们分离开来。

2.3 里氏替换原则

里氏替换实质上是多态:子类型必须能够替换掉它们的父类型。继承是实现扩展的一种实现手段,而里氏替换正是使用继承,只有子类型能够正确替换父类型,才能很好的实现扩展,否则就会出错。

2.4 依赖倒置原则

依赖倒置要求我们要依赖抽象,不要依赖具体类。那这里的抽象是什么呢?一般情况下就是接口。

2.5 接口隔离原则

不应该强迫客户依赖于他们不用的方法

3. 创建者模式

3.1 简单工厂

3.1.1 定义

提供一个创建对象实例的功能,而无需关心其具体实现。

3.1.2 举例

# encoding=utf8

import enum


class Animal(object):
    def speak(self):
        raise NotImplemented


class Cat(Animal):
    def speak(self):
        print("Cat:Meow")


class Dog(Animal):
    def speak(self):
        print("Dog:Wong")


class AnimalType(enum.Enum):
    Type_Dog = 1
    Type_Cat = 2

# 使用普通函数
def create_animal(animal_type):
    if animal_type == AnimalType.Type_Dog:
        return Dog()
    elif animal_type == AnimalType.Type_Cat:
        return Cat()

# 使用静态方法,好处是如果有多个简单工厂方法,可以作为一个类对外提供功能
class Factory(object):
    @staticmethod
    def create_animal(animal_type):
        if animal_type == AnimalType.Type_Dog:
            return Dog()
        elif animal_type == AnimalType.Type_Cat:
            return Cat()


if __name__ == '__main__':
    animal = create_animal(AnimalType.Type_Dog)
    animal.speak()
    animal = Factory.create_animal(AnimalType.Type_Cat)
    animal.speak()

 3.1.3 解释

在简单工厂中,接口、实现类和工厂方法组成了一个整体,在这个整体中,只有简单工厂方法和接口是对外的,具体的实现类不对外,被包含在简单工厂方法中。 

 3.2 工厂方法

3.2.1 定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类 。

3.2.2 举例

# encoding=utf8


class PhoneFactory(object):
    def create_factory(self):
        raise NotImplemented

    def render(self):
        phone = self.create_factory()
        phone.render()


class AndroidFactory(PhoneFactory):
    def create_factory(self):
        return Android()


class IPhoneFactory(PhoneFactory):
    def create_factory(self):
        return IPhone()


class Phone(object):
    def render(self):
        raise NotImplemented


class Android(Phone):
    def render(self):
        print("Android render")


class IPhone(Phone):
    def render(self):
        print("IPhone render")


if __name__ == '__main__':
    android = AndroidFactory()
    android.render()
    iphone = IPhoneFactory()
    iphone.render()

3.2.3 解释 

工厂方法的主要功能是让父类不知道具体实现的情况下,完成自身的功能调用,而具体的实现延迟到子类来实现。

在工厂方法模式中,一般是Creator(比如例子中的PhoneFactory)的其他方法在使用工厂方法创建的对象。

工厂方法的本质是延迟到子类来选择实现。

 

标签:常用,render,Python,self,animal,设计模式,class,def
From: https://www.cnblogs.com/bfstudy/p/16617458.html

相关文章

  • python的控制结构和函数
    控制结构顺序结构程序秉承着从上到下从左到右的运行规则分支结构语法1:if条件:条件成立时,才会执行......
  • 【737】排列组合通过python实现
    参考:PermutationandCombinationinPython重要代码:fromitertoolsimportpermutations得到的结果就是排列的结果,以tuple的形式显示,具体可以具体代码实现!......
  • python argsparse
    python运行时参数设置importargparse#Pressthegreenbuttonintheguttertorunthescript.if__name__=='__main__':parser=argparse.ArgumentPa......
  • python模块------pyautogui
    pyautogui目录安装基本使用鼠标操作 键盘操作输入文字问题 回到顶部安装1pipinstallpyautogui回到顶部基本使用查询......
  • 【Python-WebDriver实战篇】处理验证码的方式
    【Selenium-WebDriver实战篇】Selenium验证码处理方式之前记录过使用java去处理验证码的方式,但是总是不是特别理想,会有错误的时候。这两天项目需要,就调研了下用python去......
  • python基础——while循环
    while循环语法while条件:条件成立重复执行的代码1条件成立重复执行的代码2......应用#计算1-100累加和i=1result=0whilei<=100:resu......
  • Ubuntu 如何使用Apt在Ubuntu 18.04上安装Python 3.8
    1、以root用户或具有sudo访问权限的用户身份运行以下命令,以更新软件包列表并安装必备组件:sudoaptupdatesudoaptinstallsoftware-properties-common2、将Deadsnak......
  • 十年老程序员:C、Python、Java 不可兼得,专心学好一门编程语言就行!
    序言哈喽兄弟萌,很多铁铁在刚开始学编程的时候,总是避免不了看到某些哗众取宠的博主发的视频或者文章,说建议同时学好几门语言,一尝试发现,同时学好几个编程语言确实没有压......
  • python 3回顾
    ord()    获取字符的整数表示char()   把编码转换成对应的字符   python可执行文件的两个开头注释信息 第二行的注释是为了让它按照UFT-8的编......
  • 什么?fei lu被python采集拉~(含完整源代码)
    前言嗨喽,大家好呀~这里是爱看美女的茜茜呐环境使用:Python3.8Pycharm[模块使用]:requests>>>数据请求模块parsel>>>数据解析模块re正则表达式......