这是我参与更文挑战的第 29 天,活动详情查看: 更文挑战
1. 概述
我们常听大佬说,你这套代码用的什么设计模式?
咦,什么是设计模式,听不懂大佬在说啥(笑哭.jpg),赶紧学习一下
设计模式是软件设计常见问题的典型解决方案。它们就像能根据需求进行调整的预制蓝图,可用于解决代码中反复出现的设计问题
设计模式与方法或库的使用方式不同,我们很难直接在自己的程序中套用某个设计模式。 模式并不是一段特定的代码, 而是解决特定问题的一般性思想。 你可以根据模式来实现符合自己程序实际所需的解决方案。
设计模式是针对面向对象语言持有的内容,是我们在面临一类的问题时候固定的做法,设计模式很多种,比较流行的是:(四人组)GOF23 种设计模式。
面向对象(OOP)是一种范式,其思想理念在代码上就是将数据块及数据相关的行为封装成特殊的,名为对象的实体,同时对象实体的生成工作是基于程序员给出的一系列“蓝图”,这些蓝图就是类。关于,面向对象特性三大特性(封装、继承、多态)。
为什么要使用设计模式?
优秀的设计模式,可以提高我们代码质量,主要有三点:
- 代码复用,提高开发效率,减少开发成本最常用的方式之一
- 扩展性强,能够在原基础的代码上开发新功能或者需求,快速上线
- 维护便利,好的框架转维护后,可以减少人员的投入
因此,对于初学者,我们学习两个最常用的模式:工厂模式和单例模式
本期,我们也从最常用的两个模式学习和模拟。
2. 工厂模式
工厂模式是一种创建型设计模式,实现了创建者和调用者的分离,使用专门的工厂类型将选择实现类、创建对象进行统一的管理和控制。
工厂模式采用在父类中提供一个创建对象的方法,允许子类决定实例化对象的模型。
工厂模式结构如下:
工厂模式适用场景有:
-
用户能扩展软件库或框架的内部组件
-
无法预知对象确切类别及其依赖关系
-
复用现有对象来节省系统资源,从而不用每次都重新创建对象
我们来实现一个简单的工厂模式DEMO,生产汽车。
class CarFactory:
def createcar(self,brand): # 对外统一由这个方法来创建不同类的对象
if brand == "奔驰":
return BENCI()
elif brand == "宝马":
return Baoma()
else:
return BYD()
class Baoma:
pass
class BENCI:
pass
class BYD:
pass
factory = CarFactory()
car1 = factory.createcar("BYD")
car2 = factory.createcar("宝马")
print("Car1车型为:",car1)
print("Car2车型为:",car2)
复制代码
工厂模式的优点:
- 可以避免创建者和具体产品之间的紧密耦合。
- 单一职责原则。 可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
- 开闭原则。 无需更改现有客户端代码,可以在程序中引入新的产品类型。
工厂模式的缺点:
应用工厂方法模式需要引入许多新的子类, 代码可能会因此变得更复杂。 最好的情况是将该模式引入创建者类的现有层次结构中。
3. 单例模式
单例模式(Singleton Pattern)的核心作用是确保一个类只有一个实例,并且提供一个访问该实例的全局访问点。
单例模式结构
- 创建对象时,会判断是否存在,如果存在则返回对象;如果不存在,创建新对象
单例模式适用场景有:
- 程序对所有客户端只创建一个可用实例
- 需要更加严格地控制全局变量
我们按照单例模式,来实现一个小DEMO
class MySinglection:
__obj = None #类属性,标志创建对象是否存在,如果存在则返回
__init_flag = True
def __new__(cls, *args, **kwargs):
if cls.__obj == None:
cls.__obj = object.__new__(cls)
return cls.__obj
def __init__(self,name):
if MySinglection.__init_flag:
print ("Init.....")
self.name = name
MySinglection.__init_flag = False #类进行调用类属性
my = MySinglection("aaa")
my2 = MySinglection("BB")
print ("my对象信息为:",my)
print ("my2对象信息为:",my2)
复制代码
单例模式优点
- 单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个单例对象,然后永久驻留内存中,从而极大的降低开销。
- 获得了一个指向该实例的全局访问节点。
- 仅在首次请求单例对象时对其进行初始化
单例模式缺点
- 违反了_单一职责原则_
- 单例模式可能掩盖不良设计, 比如程序各组件之间相互了解过多等。
- 该模式在多线程环境下需要进行特殊处理, 避免多个线程多次创建单例对象。
- 单例的客户端代码单元测试可能会比较困难, 因为许多测试框架以基于继承的方式创建模拟对象。
总结
本期我们学习和了解设计模式的基本概念,用Python去实现了我们常用到的工厂模式和单例模式,在工作中,根据实现场景的需要,我们要提前设计我们代码起到重要的作用。
为此,我们在学有余力的情况下,掌握好设计模式,也为我们的能力提升带来显著的效果。
好啦,以上是本期内容,欢迎大家评论区留言讨论,点赞关注,下次见~