在软件设计中,工厂模式常被用来创建对象和管理对象,以便于程序的扩展和维护。而其中的抽象工厂模式和工厂方法模式则是两种常见的工厂模式,本文从多个角度分析它们的区别和联系。
1. 定义与实现
工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,同时将具体创建过程延迟到子类中实现。抽象工厂模式则是定义一种可以创建一系列相关或相互依赖对象的接口,而不需要指定具体的类。它同时提供了多个工厂方法,用于创建对象的不同等级结构。
2. 可扩展性
从可扩展性来看,工厂方法模式可以很方便地增加新的产品类,只需要创建一个新的具体工厂类即可。但如果需要新增功能族,就必须修改抽象工厂和所有的具体工厂类。因此,在功能族变化频繁的情况下,工厂方法模式更加适用。
3. 使用场景
工厂方法模式适用于以下场景:
- 需要创建复杂对象的场景,由多个部分组成,这些部分可以是多个对象,也可以是对象的属性和方法。
- 需要动态地指定创建对象时的具体类。
- 需要对创建的对象进行进一步处理、加工,比如导出成不同的文件格式。
抽象工厂模式则更适用于以下情况:
- 一个系统需要多个产品族,并且这些产品族之间需要相互关联或依赖。(比如不同种类的电器,都需要使用不同种类的电线、插头等配件)
- 需要隐藏具体产品的类,只对外提供一个产品族的接口。(比如不同牌子的手机,对外只提供了通话、短信等接口,具体实现由不同的工厂负责)
4. 实例
接下来通过一个简单的实例,来更好地理解它们之间的区别和联系。
我们需要创建一个“动物园”,由“狮子”和“大象”两个动物园动物组成。工厂方法模式可以这样实现:
```python
# 定义一个动物接口
class Animal():
def voice(self):
pass
def run(self):
pass
# 定义具体的狮子类
class Lion(Animal):
def voice(self):
print("Roar!")
def run(self):
print("Lion is running.")
# 定义具体大象类
class Elephant(Animal):
def voice(self):
print("Trumpet!")
def run(self):
print("Elephant is running.")
# 定义一个动物园抽象类
class Zoo():
def create_animal(self, name):
pass
# 定义一个动物园具体类,用于创建狮子
class LionZoo(Zoo):
def create_animal(self, name):
return Lion()
# 定义一个动物园具体类,用于创建大象
class ElephantZoo(Zoo):
def create_animal(self, name):
return Elephant()
# 客户端代码
if __name__ == '__main__':
# 创建动物园
lion_zoo = LionZoo()
elephant_zoo = ElephantZoo()
# 创建动物
lion = lion_zoo.create_animal("lion")
elephant = elephant_zoo.create_animal("elephant")
# 接下来可以对动物进行操作
lion.voice()
elephant.run()
```
而抽象工厂模式则可以这样实现:
```python
# 定义一个动物接口
class Animal():
def voice(self):
pass
def run(self):
pass
# 定义具体的狮子类
class Lion(Animal):
def voice(self):
print("Roar!")
def run(self):
print("Lion is running.")
# 定义具体大象类
class Elephant(Animal):
def voice(self):
print("Trumpet!")
def run(self):
print("Elephant is running.")
# 定义一个动物园抽象类
class Zoo():
def create_animal(self, name):
pass
# 定义一个配件接口
class Part():
def get_name(self):
pass
# 定义具体配件类:电线、插头、开关、灯泡
class ElectricWire(Part):
def get_name(self):
print("Electric Wire")
class Plug(Part):
def get_name(self):
print("Plug")
class Switch(Part):
def get_name(self):
print("Switch")
class Bulb(Part):
def get_name(self):
print("Bulb")
# 定义抽象工厂类:用于创建动物和相应的配件
class ZooFactory():
def create_animal(self):
pass
def create_electric_wire(self):
pass
def create_plug(self):
pass
def create_switch(self):
pass
def create_bulb(self):
pass
# 定义具体工厂类:用于创建狮子、配件等等
class LionFactory(ZooFactory):
def create_animal(self):
return Lion()
def create_electric_wire(self):
return ElectricWire()
def create_plug(self):
return Plug()
def create_switch(self):
return Switch()
def create_bulb(self):
return Bulb()
# 定义具体工厂类:用于创建大象、配件等等
class ElephantFactory(ZooFactory):
def create_animal(self):
return Elephant()
def create_electric_wire(self):
return ElectricWire()
def create_plug(self):
return Plug()
def create_switch(self):
return Switch()
def create_bulb(self):
return Bulb()
# 客户端代码
if __name__ == '__main__':
# 创建具体工厂:狮子工厂、大象工厂
lion_factory = LionFactory()
elephant_factory = ElephantFactory()
# 创建动物和配件
lion = lion_factory.create_animal()
electric_wire = lion_factory.create_electric_wire()
plug = lion_factory.create_plug()
switch = lion_factory.create_switch()
bulb = lion_factory.create_bulb()
# 接下来可以对动物和配件进行操作
lion.voice()
electric_wire.get_name()
plug.get_name()
switch.get_name()
bulb.get_name()
```
可以看到,两种模式的区别在于是否需要创建一个工厂来统一管理不同产品的创建。工厂方法只提供了创建产品的接口,而抽象工厂则需要同时提供创建产品和创建相关配件的接口。需要根据实际需求来选择合适的模式。
扫码咨询 领取资料