(一)Python入门-6面向对象编程:12设计模式之工厂模式-单例模式

一:工厂模式实现

  设计模式是面向对象语言特有的内容,是我们在面临某一类问题时候固定的做法,设计 模式有很多种,比较流行的是:GOF(Goup Of Four)23 种设计模式。

  工厂模式实现了创建者和调用者的分离,使用专门的工厂类将选择实现类、创建对象进 行统一的管理和控制。

【操作】

#工厂模式实现
class CarFactory:
    def creatCar(self,brand):
        if brand == ‘奔驰‘:
            return Benz()
        elif brand == ‘宝马‘:
            return BMW()
        elif brand == ‘比亚迪‘:
            return BYD()
        else:
            return ‘位置品牌,无法创建‘
class Benz:
    pass
class BMW:
    pass
class BYD:
    pass

factory = CarFactory()
c1 = factory.creatCar(‘奔驰‘)
c2 = factory.creatCar(‘宝马‘)
print(c1)
print(c2)

运行结果:

  <__main__.Benz object at 0x000001DF7C4B8FD0>
  <__main__.BMW object at 0x000001DF7C4E0048>

二:单例模式实现

  单例模式(Singleton Pattern)的核心作用是确保一个类只有一个实例,并且提供一 个访问该实例的全局访问点。

  单例模式只生成一个实例对象,减少了对系统资源的开销。当一个对象的产生需要比较 多的资源,如读取配置文件、产生其他依赖对象时,可以产生一个“单例对象”,然后永久 驻留内存中,从而极大的降低开销。

  单例模式有多种实现的方式,我们这里推荐重写__new__()的方法。

【操作】

#单例模式实现
class MySingleton:
    __obj = None     #用于判断对象是否已经创建,保证只创建一个对象
    __init_flag = True   #用于判断是否已进行初始化,保证只初始化一次

    def __new__(cls, *args, **kwargs):
        if cls.__obj == None:    #判断是否已创建对象,为None说明没有对象,进行创建,否则对象已有不再创建
            cls.__obj = object.__new__(cls)
        return cls.__obj

    def __init__(self,name):
        if MySingleton.__init_flag:   #判断是否初始化,True未初始化,进行初始化操作
            print(‘init...‘)
            self.name = name
            MySingleton.__init_flag = False   #初始化标记设为False,保证只初始化一次

a = MySingleton(‘aa‘)
print(a)
b = MySingleton(‘bb‘)
print(b)
c = MySingleton(‘cc‘)
print(c)

运行结果:(a,b,c为同一个对象)

  init...
  <__main__.MySingleton object at 0x000001E43BFF8400>
  <__main__.MySingleton object at 0x000001E43BFF8400>
  <__main__.MySingleton object at 0x000001E43BFF8400>

三:工厂模式和单例模式的整合

  设计模式称之为“模式”,就是一些固定套路。我们很容易用到其他场景上,比如工厂模式,我们如果将工厂类定义成“单例”,只需要简单的套用即可实现:

【操作】

#测试工厂模式和单例模式的整合使用

class CarFactory:
    __obj = None
    __init_flag = True

    def creatCar(self,brand):
        if brand == ‘奔驰‘:
            return Benz()
        elif brand == ‘宝马‘:
            return BMW()
        elif brand == ‘比亚迪‘:
            return BYD()
        else:
            return ‘位置品牌,无法创建‘

    def __new__(cls, *args, **kwargs):
        if cls.__obj == None:
            cls.__obj = object.__new__(cls)
        return cls.__obj

    def __init__(self):
        if CarFactory.__init_flag:
            print(‘init CarFactory...‘)
            CarFactory.__init_flag = False

class Benz:
    pass
class BMW:
    pass
class BYD:
    pass

factory = CarFactory()
c1 = factory.creatCar(‘奔驰‘)
c2 = factory.creatCar(‘宝马‘)
print(c1)
print(c2)

factory2 = CarFactory()
print(factory,factory2)

运行结果:

  init CarFactory...
  <__main__.Benz object at 0x0000017735D200B8>
  <__main__.BMW object at 0x0000017735D20080>
  <__main__.CarFactory object at 0x0000017735D20048> <__main__.CarFactory object at 0x0000017735D20048>

原文地址:https://www.cnblogs.com/jack-zh/p/10850538.html

时间: 2024-10-29 00:34:49

(一)Python入门-6面向对象编程:12设计模式之工厂模式-单例模式的相关文章

(一)Python入门-6面向对象编程:01面向对象和面向过程区别-对象的进化

面向对象: 面向对象(Object oriented Programming,OOP)编程的思想主要是针对大型 软件设计而来的.面向对象编程使程序的扩展性更强.可读性更好,使的编程可以像搭 积木一样简单. 面向对象编程将数据和操作数据相关的方法封装到对象中,组织代码和数据的方式 更加接近人的思维,从而大大提高了编程的效率. Python完全采用了面向对象的思想,是真正面向对象的编程语言,完全支持面向 对象的基本功能,例如:继承.多态.封装等. Python中,一切皆对象.我们在前面学习的数据类型

(一)Python入门-6面向对象编程:07面向对象三大特征(封装、继承、多态)-继承

一:面向对象三大特征介绍 Python是面向对象的语言,也支持面向对象编程的三大特性:继承.封装(隐藏).多态. 封装(隐藏) 隐藏对象的属性和实现细节,只对外提供必要的方法.相当于将“细节封装起来”,只 对外暴露“相关调用方法”. 通过前面学习的“私有属性.私有方法”的方式,实现“封装”.Python 追求简洁的语法,没有严格的语法级别的“访问控制符”,更多的是依靠程序员自觉实现. 继承 继承可以让子类具有父类的特性,提高了代码的重用性. 从设计上是一种增量进化,原有父类设计不变的情况下,可以

(一)Python入门-6面向对象编程:12组合

组合: “is-a”关系,我们可以使用“继承”.从而实现子类拥有的父类的方法和属性.“is-a” 关系指的是类似这样的关系:狗是动物,dog is animal.狗类就应该继承动物类. “has-a”关系,我们可以使用“组合”,也能实现一个类拥有另一个类的方法和属性.” has-a”关系指的是这样的关系:手机拥有 CPU. MobilePhone has a CPU. [操作] #测试组合 import copy class MobilePhone: def __init__(self,cpu,

(一)Python入门-6面向对象编程:04__del__方法(析构函数)和垃圾回收机制-__call__方法和可调用对象

一:__del__方法(析构函数)和垃圾回收机制 __del__方法称为“析构方法”,用于实现对象被销毁时所需的操作.比如:释放对象 占用的资源,例如:打开的文件资源.网络连接等. Python实现自动的垃圾回收,当对象没有被引用时(引用计数为 0),由垃圾回收器 调用__del__方法. 我们也可以通过del 语句删除对象,从而保证调用__del__方法. 系统会自动提供__del__方法,一般不需要自定义析构方法. [操作] #析构函数 class Person: def __del__(s

Python入门之面向对象编程(二)python类的详解

本文通过创建几个类来覆盖python中类的基础知识,主要有如下几个类 Animal :各种属性.方法以及属性的修改 Dog :将方法转化为属性并操作的方法 Cat :私人属性讲解,方法的继承与覆盖 Tiger :子类定义时调用父类方法(super的使用) Animal python中的一个类中有属性和方法,而二者都分为很多种类型,如下所示 属性分为普通属性和类属性 方法分为普通方法.类方法.静态方法. 具体定义方法和使用见下面的代码和注释,各个属性和方法的使用习惯等见最后的 print_anim

(一)Python入门-6面向对象编程:11对象的浅拷贝和深拷贝

对象的浅拷贝和深拷贝: 变量的赋值操作 只是形成两个变量,实际还是指向同一个对象. 浅拷贝 Python拷贝一般都是浅拷贝.拷贝时,对象包含的子对象内容不拷贝.因此,源对象 和拷贝对象会引用同一个子对象. 深拷贝 使用copy模块的 deepcopy 函数,递归拷贝对象中包含的子对象.源对象和拷贝对象 所有的子对象也不同. [操作] #测试对象的引用赋值,浅拷贝,深拷贝 import copy class MobilePhone: def __init__(self,cpu,screen): s

(一)Python入门-6面向对象编程:10特殊方法和运算符重载-特殊属性

一:特殊方法和运算符重载 Python的运算符实际上是通过调用对象的特殊方法实现的.比如: #运算符-特殊方法 a = 20 b = 30 c = a + b d = a.__add__(b) print('c=',c) print('d=',d) 运行结果: c= 50 d= 50 常见的特殊方法统计如下: 每个运算符实际上都对应了相应的方法,统计如下: 我们可以重写上面的特殊方法,即实现了“运算符的重载”. [操作]运算符的重载 #测试运算符的重载 class Person: def __i

(一)Python入门-6面向对象编程:05方法没有重载-方法的动态性

一:方法没有重载 在其他语言中,可以定义多个重名的方法,只要保证方法签名唯一即可.方法签名包含 3 个部分:方法名.参数数量.参数类型. Python中,方法的的参数没有声明类型(调用时确定参数的类型),参数的数量也可以由 可变参数控制.因此,Python中是没有方法的重载的.定义一个方法即可有多种调用方式, 相当于实现了其他语言中的方法的重载. 如果我们在类体中定义了多个重名的方法,只有最后一个方法有效. 建议:不要使用重名的方法!Python中方法没有重载. [操作] #Python中没有方

(一)Python入门-6面向对象编程:02类的定义-类和对象的关系-构造函数-实例属性-实例方法

一:类的定义 如果把对象比作一个“饼干”,类就是制造这个饼干的“模具”. 我们通过类定义数据类型的属性(数据)和方法(行为),也就是说,“类将行为和状态打 包在一起”. 对象是类的具体实体,一般称为“类的实例”.类看做“饼干模具”,对象就是根据这个“模 具”制造出的“饼干”. 从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属 性值(不共享状态).更具体一点:“方法代码是共享的,属性数据不共享”. Python中,“一切皆对象”.类也称为“类对象”,类的实例也称为“