设计模式描述了软件设计过程中经常碰到的问题及解决方案,它是面向对象设计经验的总结和理论化抽象。通过设计模式,开发者就可以无数次地重用已有的解决方案,无需再重复相同的工作。本篇将简单介绍工厂模式与适配器模式。
工厂模式
工厂模式主要用来实例化有共同方法的类,它可以动态决定应该实例化哪一个类,不必事先知道每次要实例化哪一个类。例如在编写一个应用程序时,用户可能会连接各种各样的数据库,但开发者不能预知用户会使用哪个数据库,于是提供一个通用方法,里面包含了各个数据库的连接方案,用户在使用过程中,只需要传入数据库的名字并给出连接所需要的信息即可,如下所示。
1 class Operation(object):
2 def connect(self):
3 pass
4 class MySQL(Operation):
5 def connect(self):
6 print('连接MySQL成功')
7 class SQLite(Operation):
8 def connect(self):
9 print('连接SQLite成功')
10 class DB(object):
11 @staticmethod
12 def create(name):
13 name = name.lower()
14 if name == 'mysql':
15 return MySQL()
16 elif name == 'sqlite':
17 return SQLite()
18 else:
19 print('不支持其他数据库')
20 if __name__ == '__main__':
21 db1 = DB.create('MySQL')
22 db1.connect()
23 db2 = DB.create('SQLite')
24 db2.connect()
运行结果如下图所示。
在上例中,第10行定义DB类,类中定义了一个静态方法create (),该方法的参数为类名,可以根据类名创建对应的对象,因此称为工厂方法。从程序运行结果可看出,工厂方法可以根据类名创建相应的对象。
适配器模式
适配器模式是指一种接口适配技术,实现两个不兼容接口之间的兼容,例如原程序中存在类Instrument与Person,其中Instrument实例对象可以调用play()方法,Person实例对象可以调用act()方法,新程序中增加类Computer,其实例对象可以调用execute()方法,现要求类Instrument与Person的实例对象通过execute()调用各自的方法,具体如下所示。
1 class Instrument(object): # 乐器类,原程序存在的类
2 def __init__(self, name):
3 self.name = name
4 def play(self):
5 print(self.name, '演奏')
6
7 class Person(object): # 人类,原程序存在的类
8 def __init__(self, name):
9 self.name = name
10 def act(self):
11 print(self.name, '表演')
12 class Computer(object): # 计算机类,新程序添加的类
13 def __init__(self, name):
14 self.name = name
15 def execute(self):
16 print(self.name, '执行程序')
17 class Adapter(object): # 适配器类,用于统一接口
18 def __init__(self, obj, adaptedeMthods):
19 self.obj = obj
20 self.__dict__.update(adaptedeMthods)
21 if __name__ == '__main__':
22 obj1 = Instrument('guitar')
23 Adapter(obj1, dict(execute = obj1.play)).execute()
24 obj2 = Person('xiaoqian')
25 Adapter(obj2, dict(execute = obj2.act)).execute()
运行结果如下图所示。
在上例中,第17行定义适配器类,第20行使用类的内部字典
dict
,它的键是属性名,值是相应属性对象的数据值。第23、25行通过适配器类的实例对象实现了新程序与原程序的兼容。