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 实现的 简单工厂设计模式。

原文地址:https://www.cnblogs.com/jerryxing/p/2873338.html