大话设计模式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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

posted @ 2017-11-14 14:42  Andy冉明  阅读(2662)  评论(0编辑  收藏  举报