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