您的位置:首页 > 编程语言 > Python开发

python实践设计模式(一)概述和工厂模式

2013-05-10 15:07 246 查看

    目录

    python实践设计模式(一)概述和工厂模式 

    python实践设计模式(二)Builder,Singleton,Prototype

  学习python有一段时间,之前就是看看书,最后发现只有实践才能真正学到东西,只有在解决问题中才能真正掌握。之前大牛也有用python实现各种设计模式的,我自己参考之前在学习用C#实现设计模式的经历,也想把23种模式逐一实践,从网上查了一些资料,才明白python虽然是面向对象的,但是和C#,java语言不太一样。影响设计方法不一样有以下几点:

  1.python没有接口Interface的类型。

  2.由于《Design Patterns—Elements of Reusable Object-Oriented Software》一书采用的是C++来讲述设计模式,因此访问控制符(public、protected和private等关键字)和静态成员方法(类方法)等都可以直接使用,但是这些特性在Python中都无法用到,原因是Python采了与C++完全不同的对象模式。

  3.python不是强类型,弱化了多态的概念,一个对象很少只是一个类的实例,而是可以在运行时动态改变,支持相同请求的不同对象针对同一请求所触发的操作可能完全不同。

  4.python代码生存在modules中而不必须在class中。

  5.python有一些特殊语法运用了设计模式(如decorator ),可以直接应用。 

有了以上的不同,就注定python在运用设计模式上与其他面向对象语言的不同,下面是我尝试的实现。

  《Design Patterns》一书把设计模式分为了3大类,创建型模式(creational pattern)、结构型模式(structural pattern)和行为型模式(behavioral patterns)。

[b]  一. 创建型模式(creational pattern)[/b]

  对类的实例化过程进行了抽象,能够使软件模块做到与对象创建和组织的无关性。为了使体系结构更加清晰,一些软件在设计上要求当创建类的具体实例时,能够根据具体的语境来动态地决定怎样创建对象,创建哪些对象,以及怎样组织和表示这些对象,而创建型模式所要描述的就是该如何来解决这些问题。

创建型模式包括以下几种:

Simple Factory模式
  专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。

Factory Method模式
  将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。

Abstract Factory模式
  提供一个共同的接口来创建相互关联的多个对象。

Singleton模式
  保证系统只会产生该类的一个实例,同时还负责向外界提供访问该实例的标准方法。
Builder模式
  将复杂对象的创建同它们的具体表现形式(representation)区别开来,这样可以根据需要得到具有不同表现形式的对象。
Prototype模式
  利用一个能对自身进行复制的类,使得对象的动态创建变得更加容易。

本次先实践Simple Factory模式,Factory Method模式和 Abstract Factory模式,其他模式后续会涉及。

1.Simple Factory模式

  Simple Factory模式不是独立的设计模式,他是Factory Method模式的一种简单的、特殊的实现。他也被称为静态工厂模式,通常创建者的创建方法被设计为static方便调用,但是python没有static一说。所以可以把创建者也就是工厂设计为一个普通class或全局函数即可。如果是class还需要实例化才能调用工厂方法,而全局函数比较简单,比较接近静态工厂的简便特性。

Simple Factory模式包含以下角色部分,UML可参考下图:

1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。由一个具体类实现,通常该类的工厂方法是静态的。在python中工厂为一个普通class或全局函数。

2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。在python中抽象产品一般为父类。

3) 具体产品角色:工厂类所创建的对象就是此角色的实例。由一个具体类实现。

Abstract Factory

class Newcar:
'''Abstract Product'''
def drive(self):
pass

class NewBMW(Newcar):
'''Concrete Product'''
def __init__(self,carname):
self.__name=carname
def drive(self):
print "Drive the New BMW as "+self.__name

class NewBenz(Newcar):
'''Concrete Product'''
def __init__(self,carname):
self.__name=carname
def drive(self):
print "Drive the New Benz as "+self.__name

class Oldcar:
'''Abstract Product'''
def drive(self):
pass

class OldBMW(Oldcar):
'''Concrete Product'''
def __init__(self,carname):
self.__name=carname
def drive(self):
print "Drive the Old BMW as "+self.__name

class OldBenz(Oldcar):
'''Concrete Product'''
def __init__(self,carname):
self.__name=carname
def drive(self):
print "Drive the Old Benz as "+self.__name

class driver:
'''Abstract Factory also called Creator'''
def driverNewCar(self):
return Newcar()
def driverOldCar(self):
return Oldcar()

class BMWdriver(driver):
'''Concrete Factory or Creator'''
def driverNewCar(self):
return NewBMW("NewBMW")
def driverOldCar(self):
return OldBMW("OldBMW")

class Benzdriver(driver):
'''Concrete Factory or Creator'''
def driverNewCar(self):
return NewBenz("NewBenz")
def driverOldCar(self):
return OldBenz("OldBenz")

if __name__ == "__main__":
driver=BMWdriver()
car=driver.driverNewCar()
car.drive()
car=driver.driverOldCar()
car.drive()
driver=Benzdriver()
car=driver.driverNewCar()
car.drive()
car=driver.driverOldCar()
car.drive()


未完待续……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: