抽象工廠模式(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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。