工厂模式?
工厂模式有多种,如果概括的想,可以将抽象工厂也算作工厂模式。主要由简单工厂模式,和有所区分的工厂方法模式和抽象工厂模式。
简单工厂模式
即将对象的创建交给工厂来完成,由工厂来完成具体的对象创建的操作。这样的所谓简单工厂模式,其实严格来说并不是一种设计模式,而只是一种编程习惯。
class Square:
def draw(self):
print "drawing a square"
class Triangle:
def draw(self):
print "drawing a triangle"
class ShapeFactory(object):
@classmethod
def createShape(self, shape):
return {
'square': Square(),
'triangle': Triangle()
}[shape]
if __name__ == "__main__":
square = ShapeFactory.createShape("square")
square.draw()
triangle = ShapeFactory.createShape("triangle")
triangle.draw()
工厂方法模式
定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
说明:工厂方法模式用来处理对象的创建,让子类来决定创建的对象是什么,于是将创建对象的过程封装。
也就是说,现在我们依然是用工厂来创建对象,但是这个工厂不是具体的,而是一个抽象的工厂,子类实现这个抽象的工厂,所以不同的子类就可以得到不同的工厂,所以相当于把具体实例化的过程推迟到子类,因为不同的工厂得到不同的产品。(在python中因为没有接口的概念,虽然可以用一些模块来代替,但是从语言本身来说,这样做并不是必须的,所以直接得到多个工厂即可,似乎对这个模式并不是很强调)
抽象工厂模式
定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
说明:其实抽象工厂模式常常会运用到工厂方法模式,主要是用来处理关于具体工厂的问题。但是抽象工厂模式并不是工厂方法模式,抽象工厂模式主要是采用抽象的工厂来将工厂组合起来,不需要考虑的具体的工厂类型,java中,用抽象的工厂来先定义需要的几种具体工厂,但是实际上具体工厂的实现是由实现了抽象工厂的具体工厂来实现的(这里用到了工厂方法模式),于是就将几种工厂组合在了一起。
python的示例:
class Dog(object):
def speak(self):
return "woof"
def __str__(self):
return "Dog"
class Cat(object):
def speak(self):
return "meow"
def __str__(self):
return "Cat"
class CatFactory(object):
@property
def pet(self):
return Cat()
@property
def food(self):
return "cat food"
class DogFactory(object):
@property
def pet(self):
return Dog()
@property
def food(self):
return "dog food"
class PetShop(object):
def __init__(self, animal_factory=None):
self._pet_factory = animal_factory
def show_pet(self):
pet = self._pet_factory.pet
print("we have a {}".format(pet))
print("It says {}".format(pet.speak()))
print("And we have {}".format(self._pet_factory.food))
if __name__ == "__main__":
shop = PetShop(DogFactory())
shop.show_pet()
another_shop = PetShop(CatFactory())
another_shop.show_pet()
这里的petshop就相当于一个抽象工厂了,将两种工厂组合在一起。