工厂模式和单例模式

Posted 智趣智学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式和单例模式相关的知识,希望对你有一定的参考价值。

工厂模式用于实现创建者和调用者的分离,通过一个超类抽象化的逻辑接口来创建一个特定的类型对象。

实例:

'''创建一个超类'''
class Person:
   
def __init__(self):
       
self.name= None
       
self.age =None
    def
getName(self):
       
return self.name
   
def getAge(self):
       
return self.age
'''创建两个子类'''
class man(Person):
   
def __init__(self,name):
       
print('hello mr' + name)
class woman(Person):
   
def __init__(self,name):
       
print('hi Miss' + name)
'''创建工厂对上述程序进行逻辑封装,在这段封装代码中好多人不理解class Factory这个类里面没有体现任何与超类关联的内容,为什么print(per)可以调用超类中的内容呢?这里的解释是:可能是因为这段程序里没有写__init__这个方法,没写这个方法就意味着题主没有打算重写这个方法,既然是没打算重写,那么就得继承,距离这段程序最近的一个__init__()是class woman(Person)类 所以说只能继承最近的这个类的方法,并且因为这个类是超类的子类,所以变相也就继承了超类的方法,所以可以调用超类中的内容'''
class Factory:
   
def getPerson(self,name,age):
       
if age ==18:
           
return man(name)
       
if age ==19:
           
return woman(name)

'''调用上述程序'''
fc = Factory()
per = fc.getPerson(
'tom',int(input('请输入年龄')))
print(per)

单例模式:

Python中单例模式可以实现一个类只创建一个实例方法,这样的好处是节省系统资源例如下例程序:

改良前:

class Earth:
   
pass
a = Earth()
b = Earth()
print(id(a))
print(id(b))

打印结果:

22207952

22257456

改良后写法一:

class Earth:
    __leishuxing =
None


    def
__new__(cls):
       
if cls.__leishuxing == None:
           
cls.__leishuxing== object.__new__(cls)
           
return cls.__leishuxing
       
else:
           
return cls.__lleishuxing
a = Earth()
b = Earth()
print(id(a))
print(id(b))

打印结果:

257273796

257273796

 

改良后写法二:

 

class Earth(object):
    __leishuxing =
None
    def
__new__(cls):
       
if not cls.__leishuxing:
           
cls.__leishuxing= super(Earth, cls).__new__(cls)
       
return cls.__leishuxing

a = Earth()
b = Earth()
print(id(a))
print(id(b))

以上是关于工厂模式和单例模式的主要内容,如果未能解决你的问题,请参考以下文章

面向对象编程模式之“简单工厂和单例“

设计模式:简单工厂和单例工厂

2022-04-04:k8s中kubectl源码用到了哪些设计模式?除了工厂和单例。

双重检查锁定和单例模式

scala 基础十二 scala apply的使用,工厂方法和单例模式的实现

PHP设计模式之工厂模式