工厂模式(Factory Pattern)是最常见的设计模式;该设计模式属于创建式模式;
提供一种简单,快速,高效,安全地创建对象的方式。
通俗地讲:就是用工厂模式代替new操作,创建一种实例化对象的方法
本质:根据传入参数的不同,返回对应的不同对象(类似鸡生蛋),方便造对象,但不做任何动作。
工厂模式的目的是为了解耦:
1.把对象的创建和使用的过程分开。就是Class A 想调用 Class B ,那么A只是调用B的方法,而至于B的实例化,就交给工厂类。
2.工厂模式可以降低代码重复。如果创建对象B的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。我们可以这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的创建过程的修改维护。
举个简单的例子,根据不同的参数,实例化不同品牌的手机类;对调用者来说屏蔽了实例化对细节
# 思想:通过函数的方式,传不同参数来生成不同的对象
class Apple:
def __init__(self):
self.data = "创建一个苹果手机"
def getData(self):
return self.data
class HuaWei:
def __init__(self):
self.data = "创建一个华为候机"
def getData(self):
return self.data
# 工厂方法: 根据传入参数的不同, 而返回对应的对象
def mobile_factory(mobile):
if mobile == "Apple":
make_mobile = Apple
elif mobile == "HuaWei":
make_mobile = HuaWei
else:
raise ValueError("请出入正确的手机类型: {}".format(mobile))
return make_mobile()
if __name__ == "__main__":
#根据不同的参数,实例化不同品牌的手机类
apple = mobile_factory("Apple")
huawei = mobile_factory("HuaWei")
data_apple = apple.getData() # 返回String类型数据
data_huawei = huawei.getData() # 返回int类型数据
# getData()返回不同类型的数据, 这在实际开发中是很常见的
print(data_apple)
print(data_huawei)
ps:与多态的区别:
多态会调用实例的方法;
多态意味着可以对不同的对象使用同样的操作,但它们可能会以多 种形态呈现出结果。
在Python中,任何不知道对象到底是什么类 型,但又需要对象做点什么的时候,都会用到多态。
工厂模式只会返回实例,不会调用方法
举个鸭子多态的例子:
class Duck(object):
def quack(self):
print ("Quaaaaaack!")
def feathers(self):
print ("The duck has white and gray feathers.")
class Person(object):
def quack(self):
print ("The person imitates a duck.")
def feathers(self):
print ("The person takes a feather from the ground and shows it.")
def in_the_forest(duck):
duck.quack()
duck.feathers()
def game():
donald = Duck()
john = Person()
in_the_forest(donald)
in_the_forest( john)
game()