forked from qinshuang/design_model
-
Notifications
You must be signed in to change notification settings - Fork 0
/
11抽象工厂模式.py
198 lines (152 loc) · 5.29 KB
/
11抽象工厂模式.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#!urs/bin/env python
#coding:utf-8
class User(object): # 用户
def __init__(self):
self.ID = 0
self.name = ''
class Department(object): # 部门
def __init__(self): return
class IUser(object):
def Insert(self, user): return
def GetUser(self, id_): return
class SqlserverUser(IUser):
# 用于访问SQL Server的User
def Insert(self, user):
print('在SQL Server中给User表增加一条记录')
def GetUser(self, id_):
print('在SQL Server中根据ID得到User表一条记录')
class AccessUser(IUser):
# 用于访问Access的User
def Insert(self, user):
print('在Access中给User表增加一条记录')
def GetUser(self, id_):
print('在Access中根据ID得到User表一条记录')
################################################################################
class IFactory(object):
# 定义一个创建访问User表对象的抽象的工厂接口
def CreateUser(self): return
def CreateDepartment(self): return # 增加的接口方法(部门)
class SqlServerFactory(IFactory):
# 实例化SqlserverUser
def CreateUser(self):
return SqlserverUser()
def CreateDepartment(self):
return SqlserverDepartment()
class AccessFactory(IFactory):
# 实例化AccessUser
def CreateUser(self):
return AccessUser()
def CreateDepartment(self):
return AccessDepartment()
################################################################################
# 增加部门表
class IDepartment(object):
def Insert(self, department): return
def GetDepartment(self, id_): return
class SqlserverDepartment(IDepartment):
# 用于访问SQL Sever的Department
def Insert(self, department):
print('在SQL Server中给Department表增加一条记录')
def GetDepartment(self, id_):
print('在SQL Server中根据ID得到Department表一条记录')
class AccessDepartment(IDepartment):
# 用于访问SQL Sever的Department
def Insert(self, department):
print('在Access中给Department表增加一条记录')
def GetDepartment(self, id_):
print('在Access中根据ID得到Department表一条记录')
def run1():
user = User()
su = SqlserverUser()
su.Insert(user)
su.GetUser(1)
def run2():
# 工厂方法模式是定义一个用于创建对象的接口,让子类决定实例化哪一个类。
user = User()
factory = SqlServerFactory()
iu = factory.CreateUser()
iu.Insert(user)
iu.GetUser(1)
def run3():
user = User()
dept = Department()
factory = AccessFactory()
iu = factory.CreateUser() # 此时已与具体的数据库访问解除了依赖
iu.Insert(user)
iu.GetUser(1)
id_ = factory.CreateDepartment() # 此时已与具体的数据库访问解除了依赖
id_.Insert(dept)
id_.GetDepartment(1)
# 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。[DP]
class DataAccess(object):
db = 'Sqlserver' # 数据库名称,可替换成Access
# db = 'Access'
@staticmethod
def CreateUser():
# 由于db的事先设置,所以此处可以根据选择实例化出相应的对象
result = None
if DataAccess.db == 'Sqlserver':
result = SqlserverUser()
elif DataAccess.db == 'Access':
result = AccessUser()
return result
@staticmethod
def CreateDepartment():
result = None
if DataAccess.db == 'Sqlserver':
result = SqlserverDepartment()
elif DataAccess.db == 'Access':
result = AccessDepartment()
return result
# 利用反射技术
class DataAccess2(object):
db = 'Sqlserver' # 数据库名称,可替换成Access
@staticmethod
def CreateUser():
className = DataAccess.db + 'User'
return eval(className)()
@staticmethod
def CreateDepartment():
className = DataAccess2.db + 'Department'
return eval(className)()
# 反射技术+配置文件
import json
def readconfig():
with open('App.config', 'r') as f:
lines = f.read()
return json.loads(lines)
class DataAccess3(object):
conf = readconfig()
@staticmethod
def CreateUser():
className = DataAccess3.conf['db_name'] + 'User'
return eval(className)()
@staticmethod
def CreateDepartment():
className = DataAccess3.conf['db_name'] + 'Department'
return eval(className)()
# 所有在用简单工厂的地方,都可以考虑用反射技术来取出switch或if,解除分支判断带来的耦合。
def run4():
user = User()
dept = Department()
iu = DataAccess.CreateUser()
iu.Insert(user)
iu.GetUser(1)
id_ = DataAccess.CreateDepartment()
id_.Insert(dept)
id_.GetDepartment(1)
def run5():
user = User()
dept = Department()
iu = DataAccess3.CreateUser()
iu.Insert(user)
iu.GetUser(1)
id_ = DataAccess3.CreateDepartment()
id_.Insert(dept)
id_.GetDepartment(1)
if __name__ == '__main__':
# run1()
# run2()
# run3()
# run4()
run5()