工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。通过工厂模式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向不同的子类实现,这样既使得代码结构清晰,又可以轻松地扩展新的对象而无需修改原有的代码。
工厂模式的基本概念
简单工厂
简单工厂模式并不是GoF定义的23种设计模式之一,但它确实是一个非常实用的设计模式。简单工厂模式的核心思想是:根据传入的不同参数来决定实例化哪个具体的类。
示例代码
-- -------------------- ---- ------- ----- ------- --- ----- ---------------- - ------- --- ----- ---------------- - ------- --- ----- ------------- --- ------------------------- ---- ---- ---- --- -------------------- ---- --- -------------------- ---- ----- -------------- -------- ------- ----- -------- --- --- --- - -------- ------- - ---------------------------------
在这个例子中,SimpleFactory
类根据传入的参数类型决定返回哪种类型的对象。
工厂方法
工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。
示例代码
-- -------------------- ---- ------- ----- ------- - ---------- --- -------------- ----- -------------------- -------------- --- --- ----------- ------ ---------------- --- --- -------------- - ---- ------- - -------------- - ---- ------ - --------- --- ---- --------- ---- --- ---- ------ ---- ----------- ------ --- --- ----- ---------------- - ------- --- -------------- -------------------- --- --- ----- ---------------- - ------- --- -------------- -------------------- --- --- - ------ --------- - -------------------- ---- ------------------------ --------- - -------------------- ---- ------------------------
在这个例子中,Creator
类中的factory_method
方法是一个抽象方法,必须由子类实现。some_operation
方法则是用来调用factory_method
方法并使用其结果。
抽象工厂
抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
示例代码
-- -------------------- ---- ------- ------ --------------- ----- ---------------- --- ----- ---------------- --- ----- --------------- --- ---------------- ----- -------------------- -------------- --- --- ----------- ------ ---------------- --- --- ---------------- ----- -------------------- -------------- --- --- ----------- ------ ---------------- --- --- ----- ---------------- - --------------- --- ---------------- --------------------- --- --- ---------------- --------------------- --- --- ----- ---------------- - --------------- --- ---------------- --------------------- --- --- ---------------- --------------------- --- --- ----- ----------------- - ---------------- --- ----- ----------------- - ---------------- --- ----- ----------------- - ---------------- --- ----- ----------------- - ---------------- --- --- - ------ -------- - ------------------------------------- ---------- - ------------------------- ---------- - ------------------------- -------- - ------------------------------------- ---------- - ------------------------- ---------- - -------------------------
在这个例子中,AbstractFactory
模块定义了创建产品的接口,而ConcreteFactory1
和ConcreteFactory2
则实现了这些接口,提供了不同的产品实现。
工厂模式的优点
- 解耦:客户端不需要知道创建对象的具体过程。
- 灵活性:增加新的产品类时,只需要添加相应的工厂类即可,无需修改原有代码。
- 易于扩展:新产品的引入变得简单,只需添加相应的工厂类和产品类即可。
总结
工厂模式是一种非常有用的设计模式,它可以简化对象的创建过程,提高代码的可维护性和扩展性。无论是简单工厂、工厂方法还是抽象工厂,它们都有各自的适用场景,选择合适的工厂模式可以大大提高代码的质量和可读性。