一、单例模式
单例模式是一种创建型设计模式,用于确保一个类只有一个实例对象,并提供一个全局访问点来获取该实例。在软件开发中,有些类只需要拥有一个实例对象,例如全局配置信息、线程池、日志记录器等。使用单例模式可以确保这些类只有一个实例存在,从而简化了对该实例的管理和访问。
单例模式的关键特点包括:
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("索纳塔")
运行结果: