Python的单例模式和工厂模式

一、单例模式

        单例模式是一种创建型设计模式,用于确保一个类只有一个实例对象,并提供一个全局访问点来获取该实例。在软件开发中,有些类只需要拥有一个实例对象,例如全局配置信息、线程池、日志记录器等。使用单例模式可以确保这些类只有一个实例存在,从而简化了对该实例的管理和访问。
单例模式的关键特点包括:
1. 私有构造函数:单例类的构造函数(或初始化方法)被声明为私有的,以防止外部直接实例化该类。
2. 静态访问方法:通常,单例类会提供一个静态的公共方法,让客户端能够获取这个唯一的实例。这个方法可以是静态方法,也可以是类方法。
3. 惰性实例化:单例对象在第一次被请求时才被实例化,而不是在程序启动或类加载时就直接创建。这种实现方式可以节省资源,并允许在需要时进行延迟加载。
单例模式的优点是:
1. 提供了对唯一实例的严格控制和访问,避免了多个实例的存在。
2. 对于频繁使用的对象,可以节省了创建对象的开销和资源消耗。
单例模式的缺点是:
1. 单例对象在整个应用程序中处于全局状态,可能导致对全局状态的过度依赖。
2. 单例模式的扩展和构造比较困难,有时可能需要修改原有的实现代码。 

举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

1、创建单例(保证只有一个对象)

# 作者:lbl
# 时间:2023-6-30
# 目的:创建单例(保证只有一个对象)
class singleton(object):
    __instance=None
    def __new__(cls,age,name):
       if not cls.__instance:
           cls.__instance=object.__new__(cls)
       return cls.__instance

a=singleton(18,"dongge")
b=singleton(8,"dongge")

print(id(a))
print(id(b))

a.age=19
print(b.age)

运行结果:

 

2、创建单例(只执行一次init方法)

# 作者:lbl
# 时间:2023-6-30
# 目的:创建单例(只执行一次init方法)
# 实例化一个单例
class singleton(object):
    __instance=None
    __first_init=False

    def __new__(cls, age, name):
        if not cls.__instance:
            cls.__instance=object.__new__(cls)
        return cls.__instance

    def __init__(self,age,name):
        if not self.__first_init:
            self.age=age
            self.name=name
            singleton.__first_init=True

a=singleton(18,"dongge")
b=singleton(8,"dongge")

print(id(a))
print(id(b))

print(a.age)
print(b.age)

a.age=19
print(b.age)

运行结果:

二、工厂模式

工厂模式是一种创建对象的设计模式,它将对象的实例化过程封装在一个工厂类中,通过工厂类的方法来创建具体的对象,而不是直接在代码中使用new关键字实例化对象。工厂模式可以帮助我们将对象的创建与使用分离,提供了一种灵活、可扩展的方式来创建对象。
在软件开发中,我们经常遇到需要根据不同的条件或参数创建不同类型对象的情况。使用工厂模式可以将对象的创建逻辑封装在一个独立的工厂类中,客户端只需要调用工厂类的方法来创建对象,无需关心具体对象的创建过程。
工厂模式通常包含以下几个关键组件:
(1)抽象产品(Abstract Product):定义产品的抽象接口或抽象类,声明产品的通用方法。
(2)具体产品(Concrete Product):实现抽象产品接口,定义具体产品的特定实现。
(3)工厂类(Factory):负责创建具体产品对象的类,提供创建产品的方法。
使用工厂模式的主要优点包括:
(1)将对象的创建与使用分离,客户端只需通过工厂类来创建对象,无需了解具体的实现细节。
(2)简化客户端代码,减少代码的重复性和依赖性。
(3)提供了可扩展性,当需要增加新的产品类型时,只需扩展工厂类和具体产品类即可,不影响现有代码。
(4)支持编写可测试的代码,可以通过工厂类创建对象的方式进行单元测试,便于测试和维护。
工厂模式在实际应用中有多种变体,包括简单工厂模式、工厂方法模式和抽象工厂模式等。每种变体都有不同的应用场景和特点,可以根据具体需求选择合适的工厂模式来实现对象的创建。

1、简单工厂模式:

1.使用函数实现

# 作者:lbl
# 时间:2023-6-30
# 目的:工厂模式使用函数实现
#定义伊兰特车类
class yilantecar(object):
    #定义车的方法
    def move(self):
        print("---车在移动---")

    def stop(self):
        print("---停车---")

#定义索纳塔车类
class suonatacar(object):
    #定义车的方法
    def move(self):
        print("---车在移动---")

    def stop(self):
        print("---停车---")

#用来生成具体的对象
def createcar(typename):
    if typename=="伊兰特":
        car=yilantecar()
    elif typename=="索纳特":
        car=suonatacar()
    return car
#定义一个销售北京现代车的花类
class carstore(object):
    def order(self,typename):
        #让工厂根据类型,生产一辆汽车
            car=createcar(typename)
            return car

2.使用类来实现

# 作者:lbl
# 时间:2023-6-30
# 目的:使用类来实现
#定义伊兰特车类
class yilantecar(object):
    #定义车的方法
    def move(self):
        print("---车在移动---")

    def stop(self):
        print("---停车---")

#定义索那塔车类
class suonatacar(object):
    #定义车的方法
    def move(self):
        print("---车在移动---")

    def stop(self):
        print("---停车---")

#定义一个生产汽车的工厂,让其根据具体的订单产生
class carfactory(object):
    def createtory(self,typename):
        if typename=="伊兰特":
            car=yilantecar()
        elif typename=="索纳塔":
            car=suonatacar()

        return car
#定义一个销售北京现代车的店类
class carstore(object):

    def __init__(self):
        #设置4S店的指定生产汽车的工厂
        self.carfactory=carfactory()
    def order(self,typename):
        #让工厂根据类型,生产一辆汽车
        car=self.carfactory.createcar(typename)
        return car

二、工厂方法模式

工厂方法模式---多种品牌汽车

# 作者:lbl
# 时间:2023-6-30
# 目的:工厂方法模式-多种品牌的汽车4S店
#定义一个基本4S店
class carstore(object):
    #仅仅是定义了有这个方法,并没有实现具体功能,需要在子类中实现
    def createcar(self,typename):
        pass

    def order(self,typename):
        #让工厂根据类型,生产一辆汽车
        self.car=self.createcar(typename)
        self.car.move()
        self.car.stop()

#定义一个北京现代4S店类
class xiandaicarstore(carstore):

    def createcar(self,typename):
        self.carfactory=carfactory()
        return self.carfactory.createcar(typename)

#定义一个伊兰特车类
class yilantecar(object):
    #定义车的方法
    def move(self):
        print("---车在移动---")

    def stop(self):
        print("---停车---")

#定义索纳塔车类
class suonatacar(object):
    #定义车的方法
    def move(self):
        print("---车在移动---")

    def stop(self):
        print("---停车---")

#定义一个生产汽车的工厂,让其根据具体的订单生产车
class carfactory(object):
    def createcar(self,typename):
        self.typename=typename
        if self.typename=="伊兰特":
            self.car=yilantecar()
        elif self.typename=="索纳塔":
            self.car=suonatacar()
        return self.car

suonata=xiandaicarstore()
suonata.order("索纳塔")

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值