大话设计模式Python实现- 抽象工厂模式
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类
下面是一个抽象工厂的demo:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = 'Andy' 5 """ 6 大话设计模式 7 设计模式——抽象工厂模式 8 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 9 """ 10 import sys 11 12 #抽象用户表类 13 class User(object): 14 15 def get_user(self): 16 pass 17 18 def insert_user(self): 19 pass 20 21 #抽象部门表类 22 class Department(object): 23 24 def get_department(self): 25 pass 26 27 def insert_department(self): 28 pass 29 30 31 #操作具体User数据库类-Mysql 32 class MysqlUser(User): 33 34 def get_user(self): 35 print 'MysqlUser get User' 36 37 def insert_user(self): 38 print 'MysqlUser insert User' 39 40 #操作具体Department数据库类-Mysql 41 class MysqlDepartment(Department): 42 43 def get_department(self): 44 print 'MysqlDepartment get department' 45 46 def insert_department(self): 47 print 'MysqlDepartment insert department' 48 49 #操作具体User数据库-Orcal 50 class OrcaleUser(User): 51 52 def get_user(self): 53 print 'OrcalUser get User' 54 55 def insert_user(self): 56 print 'OrcalUser insert User' 57 58 #操作具体Department数据库类-Orcal 59 class OrcaleDepartment(Department): 60 61 def get_department(self): 62 print 'OrcalDepartment get department' 63 64 def insert_department(self): 65 print 'OrcalDepartment insert department' 66 67 #抽象工厂类 68 class AbstractFactory(object): 69 70 def create_user(self): 71 pass 72 73 def create_department(self): 74 pass 75 76 class MysqlFactory(AbstractFactory): 77 78 def create_user(self): 79 return MysqlUser() 80 81 def create_department(self): 82 return MysqlDepartment() 83 84 class OrcaleFactory(AbstractFactory): 85 86 def create_user(self): 87 return OrcalUser() 88 89 def create_department(self): 90 return OrcalDepartment() 91 92 if __name__ == "__main__": 93 94 db = sys.argv[1] 95 myfactory = '' 96 if db == 'Mysql': 97 myfactory = MysqlFactory() 98 elif db == 'Orcal': 99 myfactory = OrcaleFactory() 100 else: 101 print "不支持的数据库类型" 102 exit(0) 103 user = myfactory.create_user() 104 department = myfactory.create_department() 105 user.insert_user() 106 user.get_user() 107 department.insert_department() 108 department.get_department()
上面类的设计如下图:
优点:
具体工厂类如MysqlFactory在一个应用中只需要初始化一次,这样改动一个具体工厂变得很容易,只需要改变具体工厂就可以改变整个产品的配置。
具体的创建实例过程与客户端分离,客户端通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中
缺点:在新增一个具体工厂就需要增加多个类才能实现
作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。