工厂模式是一种创建型设计模式,它分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。 ,,- 简单工厂模式:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。 ,- 工厂方法模式:定义一个用于创建对象的接口,让其子类自己决定实例化哪一个工厂类。,- 抽象工厂模式:提供一种方式来封装多个相关或依赖对象的创建逻辑。
在软件开发过程中,我们经常会遇到这样的问题:如何在不修改原有代码的情况下,为不同的对象提供相同的行为,这时,工厂模式就显得尤为重要,工厂模式是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的方法,通过使用工厂模式,我们可以将对象的创建过程与使用过程解耦,使得代码更加灵活、可扩展和易于维护。
工厂模式的主要目的是为了解决以下问题:
1、降低客户端与创建对象之间的耦合度,通过将对象的创建过程封装在工厂类中,客户端只需要与工厂类交互,而不需要关心具体的对象创建过程,这样可以降低客户端与创建对象之间的耦合度,提高代码的可维护性。
2、实现对象的复用,在工厂模式中,我们可以通过缓存已经创建好的对象来实现对象的复用,当客户端需要相同的对象时,可以直接从工厂类中获取,而不需要再次创建,这样可以减少系统资源的消耗,提高系统的性能。
3、便于扩展,当需要添加新的类时,我们只需要在工厂类中添加相应的方法即可,而不需要修改原有的代码,这样可以降低系统的复杂性,便于系统的扩展。
4、隐藏内部实现细节,通过使用工厂模式,我们可以将对象的内部实现细节隐藏起来,只向外界暴露有限的接口,这样可以保护系统的安全性,防止外部对内部实现细节的篡改。
工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式三种类型:
1、简单工厂模式:简单工厂模式是最简单的工厂模式,它只需要一个接口和一个实现了该接口的具体类,客户端只需要传入参数,就可以得到对应的对象,这种模式适用于创建的对象较少的情况。
class SimpleFactory:
def create_product(self, product_type):
if product_type == "productA":
return ProductA()
elif product_type == "productB":
return ProductB()
else:
return None
2、工厂方法模式:工厂方法模式是在简单工厂模式的基础上进行改进的,它将对象的创建过程封装在抽象产品类中,具体的产品类继承自抽象产品类,客户端只需要调用工厂方法,就可以得到对应的对象,这种模式适用于创建的对象较多的情况。
from abc import ABC, abstractmethod
class AbstractProduct(ABC):
@abstractmethod
def operation(self):
pass
class ConcreteProductA(AbstractProduct):
def operation(self):
return "ConcreteProductA"
class ConcreteProductB(AbstractProduct):
def operation(self):
return "ConcreteProductB"
class Factory:
@staticmethod
def create_product(product_type):
if product_type == "productA":
return ConcreteProductA()
elif product_type == "productB":
return ConcreteProductB()
else:
return None
3、抽象工厂模式:抽象工厂模式是工厂方法模式的进一步改进,它将一组具有同一主题的产品组织在一起,形成一个抽象工厂,客户端只需要调用抽象工厂的方法,就可以得到对应的产品组合,这种模式适用于创建的对象较多且具有相似特征的情况。
from abc import ABC, abstractmethod
class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self):
pass
@abstractmethod
def create_product_b(self):
pass
class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ConcreteProductA1()
def create_product_b(self):
return ConcreteProductB1()
class ConcreteFactory2(AbstractFactory):
def create_product_a(self):
return ConcreteProductA2()
def create_product_b(self):
return ConcreteProductB2()