1. 工厂模式简介
工厂模式是一种创建型设计模式,它提供了一种创建对象的接口,但由具体实现类决定实例化哪个类。工厂模式将对象的创建与使用分离,客户端只需要知道接口,而不需要知道具体的实现类。
工厂模式主要包括三种类型:
简单工厂模式
工厂方法模式
抽象工厂模式
2. 简单工厂模式
简单工厂模式(Simple Factory Pattern)又称静态工厂方法模式,通过一个工厂类在运行时决定创建哪个具体的产品类。以下是一个简单的实例:
2.1 定义产品接口
class Product:
def __init__(self):
pass
def operation(self):
pass
2.2 定义具体产品
class ConcreteProductA(Product):
def operation(self):
return "ConcreteProductA"
class ConcreteProductB(Product):
def operation(self):
return "ConcreteProductB"
2.3 定义工厂类
class SimpleFactory:
def create_product(self, product_type):
if product_type == "A":
return ConcreteProductA()
elif product_type == "B":
return ConcreteProductB()
else:
raise ValueError("Invalid product type")
2.4 使用工厂创建产品
factory = SimpleFactory()
product1 = factory.create_product("A")
product1.operation() # Output: "ConcreteProductA"
product2 = factory.create_product("B")
product2.operation() # Output: "ConcreteProductB"
3. 工厂方法模式
工厂方法模式(Factory Method Pattern)是简单工厂模式的进一步抽象和推广。它定义了一个用于创建对象的接口,但将具体的实例化过程由工厂类推迟到了子类中。
3.1 定义产品接口和工厂接口
class Product:
def operation(self):
pass
class Factory:
def create_product(self):
pass
3.2 定义具体产品和具体工厂
class ConcreteProductA(Product):
def operation(self):
return "ConcreteProductA"
class ConcreteProductB(Product):
def operation(self):
return "ConcreteProductB"
class ConcreteFactoryA(Factory):
def create_product(self):
return ConcreteProductA()
class ConcreteFactoryB(Factory):
def create_product(self):
return ConcreteProductB()
3.3 使用工厂方法创建产品
factory_a = ConcreteFactoryA()
product_a = factory_a.create_product()
product_a.operation() # Output: "ConcreteProductA"
factory_b = ConcreteFactoryB()
product_b = factory_b.create_product()
product_b.operation() # Output: "ConcreteProductB"
4. 抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它实现了一种“工厂的工厂”,即工厂类也可以创建其他工厂类。
4.1 定义抽象工厂接口和抽象产品接口
class AbstractFactory:
def create_product_a(self):
pass
def create_product_b(self):
pass
class AbstractProductA:
def operation(self):
pass
class AbstractProductB:
def operation(self):
pass
4.2 定义具体工厂和具体产品
class ConcreteFactoryA(AbstractFactory):
def create_product_a(self):
return ConcreteProductA()
def create_product_b(self):
return ConcreteProductB()
class ConcreteFactoryB(AbstractFactory):
def create_product_a(self):
return AnotherConcreteProductA()
def create_product_b(self):
return AnotherConcreteProductB()
class ConcreteProductA(AbstractProductA):
def operation(self):
return "ConcreteProductA"
class ConcreteProductB(AbstractProductB):
def operation(self):
return "ConcreteProductB"
class AnotherConcreteProductA(AbstractProductA):
def operation(self):
return "AnotherConcreteProductA"
class AnotherConcreteProductB(AbstractProductB):
def operation(self):
return "AnotherConcreteProductB"
4.3 使用抽象工厂创建产品
factory_a = ConcreteFactoryA()
product_a = factory_a.create_product_a()
product_a.operation() # Output: "ConcreteProductA"
product_b = factory_a.create_product_b()
product_b.operation() # Output: "ConcreteProductB"
factory_b = ConcreteFactoryB()
product_a = factory_b.create_product_a()
product_a.operation() # Output: "AnotherConcreteProductA"
product_b = factory_b.create_product_b()
product_b.operation() # Output: "AnotherConcreteProductB"
5. 总结
工厂模式是一种创建型设计模式,适用于创建复杂对象或一系列相关对象的场景。它将对象的创建过程封装在工厂类中,使用时只需要通过工厂类来创建对象,无需关心具体的实现细节。
简单工厂模式适用于创建单一类型的对象,工厂方法模式适用于创建一系列相关对象的场景,而抽象工厂模式适用于创建一系列相关或相互依赖的对象。
使用工厂模式可以提高代码的可维护性和扩展性,并且可以实现代码的解耦,降低代码的依赖性。