工厂模式
工厂模式是一个在软件开发中用来创建对象的设计模式。
工厂模式,顾名思义就是我们可以通过一个指定的“工厂”获得需要的“产品”,在设计模式中主要用于抽象对象的创建过程,让用户可以指定自己想要的对象而不必关心对象的实例化过程。
好处是用户只需通过固定的接口而不是直接去调用类的实例化方法来获得一个对象的实例,隐藏了实例创建过程的复杂度,解耦了生产实例和使用实例的代码,降低了维护的复杂性。
基于工厂模式实现的代码,可扩展、可维护性更好。
场景
1.当你不知道用哪个类去创建这个类的时候。
2.当你想要在创建类与支持创建对象的类之间创建一个可扩展的关联。
比如:
当程序运行输入一个“类型”的时候,需要创建与此相应的对象。这就用到了工厂模式。
当增加一个新的类型,不需要修改已存在的类,只需增加能够产生新类型的子类。
不理解?
程序员就应该用代码来交流。往下看。
实现
class A:
def __init__(self):
self.word = "运行A"
def run(self):
print(self.word)
class B:
def __init__(self):
self.word = "运行B"
def run(self):
print(self.word)
def Interface(classname):
"""
工厂模式接口函数
:param classname:
:return:
"""
run = dict(A=A, B=B)
return run[classname]()
if __name__ == '__main__':
test1 = Interface('A')
test1.run()
test2 = Interface('B')
test2.run()
输出:
运行A
运行B
抽象工厂模式
工厂方法:定义一个用于创建对象的接口函数Interface,让子类决定实例化哪一个类A或者B。
抽象工厂:创建一系列相关或相互依赖抽象出来的对象接口Interface,不需要具体指明实例化A类或B类。
抽象工厂、工厂方法异同比较:工厂模式实例化的类在接口方法里已经通过字典方式例举出来了,也就是不是实例化A就是B。但是抽象工厂实例化的类未知,可以在抽象接口类里传入A或者B,也可以新建一个C类传入。
类本身就是对象的抽象,但是抽象工厂是对类的抽象,相同方法、相同属性的归并。
实现
class A(object):
def __init__(self):
self.word = "运行A"
def run(self):
print(self.word)
class B(object):
def __init__(self):
self.word = "运行B"
def run(self):
print(self.word)
class Interface(object):
"""
抽象工厂模式接口类
"""
def __init__(self, classname=None):
self.test = classname
def run(self):
self.test().run()
if __name__ == '__main__':
test1 = Interface()
test1.test = A
test1.run()
test1.test = B
test1.run()
输出:
运行A
运行B