• Python 设计模式 简单工厂模式


        简单工厂模式,作为OO ,一个较为简单的创建者设计模式。其主要思想,通过接口或继承创建 不同的子类。

     

        现在一个DOM解析器作为父类,其中XML,SOUP 分别作为两个不同解析方式,作为子类。

       Vechicl 的创建 如下

      

    Vechicle
     1 #外部依赖的接口,它屏蔽了我具体使用的第三方库
     2 class tnDomTree:
     3     def __init__(self,htmlStream):
     4         self.htmlStream = htmlStream
     5     
     6     def getLinkList(self):
     7         pass
     8     
     9     def getImageList(self):
    10         pass
    11     
    12     def elementToString(self,element):
    13         pass
    14     
    15     def getAttrValueOfElement(self,element,attName):
    16         pass

     具体子类的实现方式 

    XML

    XML
     1 from lxml.html import tostring
     2 from lxml.html.soupparser import fromstring
     3 class tnDomTreeWithlXml(tnDomTree):
     4     def __init__(self,htmlStream):
     5         tnDomTree.__init__(self,htmlStream)
     6         self._tree = fromstring(self.htmlStream)
     7     
     8     def getLinkList(self):
     9         list = []
    10         for i in self._tree.iter():
    11             if i.tag == 'a':
    12                 list.append(i)
    13         return list
    14     
    15     def getImageList(self):
    16         list = []
    17         for i in self._tree.iter():
    18             if i.tag == 'img':
    19                 list.append(i)
    20         return list
    21     
    22     def elementToString(self,element):
    23         return tostring(element)
    24     
    25     def getAttrValueOfElement(self,element,attName):
    26         if attName in set(element.keys()):
    27             return str(element.attrib[attName])
    28         else:
    29             return ""

    SOAP

    SOAP
    from BeautifulSoup import BeautifulSoup
    class tnDomTreeWithSoup(tnDomTree):
        def __init__(self,htmlStream):
            tnDomTree.__init__(self,htmlStream)
            self._tree = BeautifulSoup(self.htmlStream)
        
        def getLinkList(self):
            return self._tree.findAll('a')
        
        def getImageList(self):
            return self._tree.findAll('img')
        
        def elementToString(self,element):
            return str(element)
        
        def getAttrValueOfElement(self,element,attName):
            if hasattr(element,attName):
                return str(element[attName])
            else:
                return ""

    creator

    Creater
    1 #工厂模式
    2 def createDomTree(htmlStream,type='soup'):
    3     if type == "soup":
    4         return tnDomTreeWithSoup(htmlStream)
    5     
    6     if type == "lxml":
    7         return tnDomTreeWithlXml(htmlStream)
    8     
    9     return None

    简单的测试 :

    Test
    if __name__ == "__main__":
        s1 = '''
        <p>BEIAI</p> <p><img src="/attachment/28" alt=""></p>
        '''
        print s1
        domtree = createDomTree(s1,'soup')
        list = domtree.getImageList()
        for i in list:
            print domtree.getAttrValueOfElement(i,'src')
            print domtree.elementToString(i)

    这就是一个简单的使用Python 实现的 简单工厂设计模式。

  • 相关阅读:
    HDOJ_2709_Sumsets
    HDOJ_2012_素数判定
    HDOJ_2011_大二写_水仙花树
    HDOJ_2010_大二写_水仙花数
    HDOJ_1290_大二写_献给杭电五十周年校庆的礼物
    HDOJ_2047_阿牛的EOF牛肉串
    HDOJ_2041_大二写_超级电梯
    HDOJ_2044_大二写_一只小蜜蜂...
    HDOJ_2046_骨牌方格_大二写
    HDOJ 2013_大二写
  • 原文地址:https://www.cnblogs.com/jerryxing/p/2873338.html
Copyright © 2020-2023  润新知