创建型模式之工厂模式
工厂模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
意图
- 定义一个接口来创建对象,但是工厂本身并不负责创建对象,而是将这一任务交给子类来完成,即子类决定了实例化那些类
- Factory方法的创建是通过继承而不是通过实例化来完成的
- 工程方法使设计更具有可定制性。它可以返回相同的实例或子类,而不是某种类型的对象
优点
1、具有更大的灵活性,使代码更加透明通用
2、松耦合的:创建对象的代码与使用它的代码是分开的,客户端完全不需要关心传递哪些参数和实例化哪些类。
3、创建新类更容易,降低了维护的成本
实现
1.简单工厂
简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂。
from abc import ABC, abstractmethod
# 手机
class Phone(ABC):
@abstractmethod
def product(self):
pass
# 苹果手机
class Apple(Phone):
def product(self):
print("product apple")
# 小米手机
class XiaoMi(Phone):
def product(self):
print("product xiaomi")
class Factory:
def product_phone(self, mobile_type):
if mobile_type == 'apple':
return Apple()
else:
return XiaoMi()
if __name__ == '__main__':
factory = Factory()
factory.product_phone('apple').product()
factory.product_phone('xiaomi').product()
简单工厂模式适用于需创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂的情况下,而且用户只关心那种类型的实例被创建,并不关心其初始化过程时,比如多种数据库(MySQL/MongoDB)的实例,多种格式文件的解析器(XML/JSON)等。但是一旦我们需要生产更多的产品,那我们就不得不去修改Factory。这样的话就违反了设计模式的“开放/封闭原则“
2.工厂方法模式
from abc import ABC, abstractmethod
# 抽象工厂
class AbastractFactory(ABC):
@abstractmethod
def product_phone(self):
pass
# 苹果工厂
class AppleFactory(AbastractFactory):
def product_phone(self):
return Apple().product()
# 小米工厂
class XiaomiFactory(AbastractFactory):
def product_phone(self):
return XiaoMi().product()
# 生产线
class Phone(ABC):
@abstractmethod
def product(self):
pass
# 苹果生产线
class Apple(Phone):
def product(self):
print("product apple")
# 小米生产线
class XiaoMi(Phone):
def product(self):
print("product xiaomi")
def client_product(factory: AbastractFactory):
return factory
if __name__ == '__main__':
xiaomi = client_product(XiaomiFactory())
xiaomi.product_phone()
apple = client_product(AppleFactory())
apple.product_phone()
工厂方法模式继承了简单工厂模式的优点又有所改进,其不再通过一个工厂类来负责所有产品的创建,而是将具体创建工作交给相应的子类去做,这使得工厂方法模式可以允许系统能够更高效的扩展。实际应用中可以用来实现系统的日志系统等,比如具体的程序运行日志,网络日志,数据库日志等都可以用具体的工厂类来创建。工厂方法模式一个工厂子类只能生产一种产品。
3.抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类
from abc import ABC, abstractmethod
# 抽象工厂
class AbastractFactory(ABC):
@abstractmethod
def product(self):
pass
# 苹果工厂
class AppleFactory(AbastractFactory):
def __init__(self, name):
self.name = name
def product(self):
if self.name == "Phone":
return Apple_Phone().product()
else:
return Apple_PC().product()
# 小米工厂
class XiaomiFactory(AbastractFactory):
def __init__(self, name):
self.name = name
def product(self):
if self.name == "Phone":
return XiaoMi_Phone().product()
else:
return XiaoMi_PC().product()
# 手机生产线
class Phone(ABC):
@abstractmethod
def product(self):
pass
# 苹果手机生产线
class Apple_Phone(Phone):
def product(self):
print("product apple Phone")
# 小米手机生产线
class XiaoMi_Phone(Phone):
def product(self):
print("product xiaomi Phone")
# PC生产线
class PC(ABC):
@abstractmethod
def product(self):
pass
# 苹果PC生产线
class Apple_PC(PC):
def product(self):
print("product apple PC")
# 小米生产线
class XiaoMi_PC(PC):
def product(self):
print("product xiaom PC")
def client_product(factory: AbastractFactory):
return factory
if __name__ == '__main__':
xiaomi = client_product(XiaomiFactory("Phone"))
xiaomi.product()
apple = client_product(AppleFactory("PC"))
apple.product()
抽象工厂模式在工厂方法基础上扩展了工厂对多个产品创建的支持,更适合一些大型系统,比如系统中有多于一个的产品族,且这些产品族类的产品需实现同样的接口,像很多软件系统界面中不同主题下不同的按钮、文本框、字体等等。
- 点赞
- 收藏
- 关注作者
评论(0)