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

  • 相关阅读:
    js中return的作用及用法
    js数组、字符串常用方法
    关于Ajax知识点小节
    关于跨域,同源策略小节
    Javascript模块化编程(三):require.js的用法【转】
    Javascript模块化编程(二):AMD规范【转】
    Javascript模块化编程(一):模块的写法【转】
    AJAX——核心XMLHttpRequest对象
    clientX,screenX,pageX,offsetX的异同 【转载】
    原生js获取鼠标坐标方法全面讲解:clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y【转】
  • 原文地址:https://www.cnblogs.com/onepiece-andy/p/python-abstract-factory-pattern.html
Copyright © 2011-2022 走看看