在使用工厂单列模式时,若是使用工厂产生的对象都继承了工厂的话会出现以下的错误(只展示正确的代码):
YES
init Factory
基础算法
<__main__.ComputerFactory object at 0x02AD2870>
<__main__.ComputerFactory object at 0x02AD2870>
<__main__.ComputerFactory object at 0x02AD2870>
<__main__.ComputerFactory object at 0x02AD2870>
所有的对象都是同一个,工厂产生的对象还是工厂本身,所以继承应该是继承父类,在工厂外面而不是工厂本身
class ComputerFactory: __obj = None __init_flag = True #工厂 def creat_computer(self, com): if com == "联想": return LX() elif com == "华硕": return HS() elif com == "神州": return SZ() else: return "位置品牌无法创建" #单例 def __new__(cls, *args, **kwargs): if cls.__obj == None: cls.__obj = object.__new__(cls) return cls.__obj def __init__(self): if ComputerFactory.__init_flag: print("init Factory") ComputerFactory.__init_flag = False #父类 class Computer: def calculate(self): print("基础算法") class LX(Computer): print("YES") def calculate(self): print("LX算法") class HS(Computer): def calculate(self): print("HS算法") class SZ(Computer): def calculate(self): print("SZ算法") def comCalculate(a): if isinstance(a, ComputerFactory): a.calculate() ''' 若是在使用工厂单列模式时,工厂所产生的对象都是继承工厂类的话 会导致工厂产生的对象都是一个。这样导致重载的方法没用,只有父类即工厂的方法有用. 所以在实际使用中只能写一个基础电脑类继承该电脑类。 ''' factory = ComputerFactory() c1 = factory.creat_computer("联想") c2 = factory.creat_computer("华硕") factory2 = ComputerFactory() c1.calculate() print(factory) print(factory2) print(c1) print(c2)
C:\Users\DYY\AppData\Local\Programs\Python\Python36-32\python.exe F:/Python_code/Test001/对象部分/test04.py
YES
init Factory
LX算法
<__main__.ComputerFactory object at 0x02AE2810>
<__main__.ComputerFactory object at 0x02AE2810>
<__main__.LX object at 0x02AE2870>
<__main__.HS object at 0x02AE2830>