工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。
按名称实例化类是工厂模式的一种常见应用,它允许程序在运行时根据字符串名称动态创建特定类的实例,而不需要在编译时硬编码具体的类。
class Dog:
def speak(self):
return "Woof!"
class Cat:
def speak(self):
return "Meow!"
class AnimalFactory:
@staticmethod
def create_animal(name):
if name == "dog":
return Dog()
elif name == "cat":
return Cat()
else:
raise ValueError(f"Unknown animal: {name}")
# 使用
animal = AnimalFactory.create_animal("dog")
print(animal.speak()) # 输出: Woof!
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class AnimalFactory(ABC):
@abstractmethod
def create_animal(self):
pass
class DogFactory(AnimalFactory):
def create_animal(self):
return Dog()
class CatFactory(AnimalFactory):
def create_animal(self):
return Cat()
# 使用
factory = DogFactory()
animal = factory.create_animal()
print(animal.speak()) # 输出: Woof!
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class AnimalFactory(ABC):
@abstractmethod
def create_animal(self):
pass
class DogFactory(AnimalFactory):
def create_animal(self):
return Dog()
class CatFactory(AnimalFactory):
def create_animal(self):
return Cat()
class AnimalFactoryProducer:
@staticmethod
def get_factory(animal_type):
if animal_type == "dog":
return DogFactory()
elif animal_type == "cat":
return CatFactory()
else:
raise ValueError(f"Unknown animal type: {animal_type}")
# 使用
factory = AnimalFactoryProducer.get_factory("dog")
animal = factory.create_animal()
print(animal.speak()) # 输出: Woof!
class Dog:
def speak(self):
return "Woof!"
class Cat:
def speak(self):
return "Meow!"
class AnimalFactory:
@staticmethod
def create_animal(animal_name):
# 获取当前模块的全局变量字典
current_module = globals()
# 检查类是否存在
if animal_name.capitalize() in current_module:
animal_class = current_module[animal_name.capitalize()]
return animal_class()
else:
raise ValueError(f"Unknown animal: {animal_name}")
# 使用
animal = AnimalFactory.create_animal("dog")
print(animal.speak()) # 输出: Woof!
原因:硬编码的类名在工厂中,当类名变更时工厂也需要相应修改。
解决方案:
原因:简单工厂模式违反开闭原则。
解决方案:
原因:反射操作比直接实例化慢。
解决方案:
原因:某些类需要复杂的初始化参数。
解决方案:
工厂模式是软件开发中非常实用的设计模式,合理使用可以大大提高代码的可维护性和扩展性。
没有搜到相关的文章