当前位置: 首页 > article >正文

设计模式 - 工厂方法模式

目录

一、核心概念

二、组成部分

三、示例代码

3.1 定义产品接口

3.2 定义具体产品类

 3.3 定义抽象工厂

3.4 定义具体工厂

3.5 客户端代码

四、与简单工厂模式的区别

五、优缺点

5.1 优点

5.2 缺点

六、总结


一、核心概念

工厂方法模式(Factory Method Pattern)是创建型模式的一种,用于创建对象而不暴露创建逻辑。它通过定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法模式让类的实例化延迟到了子类中

二、组成部分

工厂方法模式主要包括以下几个部分:

  1. 抽象工厂(Creator):定义了一个创建产品对象的工厂接口。
  2. 具体工厂(Concrete Creator):实现了抽象工厂接口,负责创建具体的产品对象。
  3. 抽象产品(Product):定义了产品的接口或抽象类。
  4. 具体产品(Concrete Product):实现了抽象产品的接口或抽象类。

三、示例代码

假设我们需要创建不同类型的披萨(Pizza),并且我们希望有一个工厂类来负责创建这些披萨。

3.1 定义产品接口

public interface Pizza {
    void prepare();
    void bake();
    void cut();
    void box();
}

3.2 定义具体产品类

public class CheesePizza implements Pizza {
    @Override
    public void prepare() {
        System.out.println("Preparing Cheese Pizza");
    }

    @Override
    public void bake() {
        System.out.println("Baking Cheese Pizza");
    }

    @Override
    public void cut() {
        System.out.println("Cutting Cheese Pizza");
    }

    @Override
    public void box() {
        System.out.println("Boxing Cheese Pizza");
    }
}

public class PepperoniPizza implements Pizza {
    @Override
    public void prepare() {
        System.out.println("Preparing Pepperoni Pizza");
    }

    @Override
    public void bake() {
        System.out.println("Baking Pepperoni Pizza");
    }

    @Override
    public void cut() {
        System.out.println("Cutting Pepperoni Pizza");
    }

    @Override
    public void box() {
        System.out.println("Boxing Pepperoni Pizza");
    }
}

 3.3 定义抽象工厂

public abstract class PizzaFactory {
    public abstract Pizza createPizza(String type);
}

3.4 定义具体工厂

public class SimplePizzaFactory extends PizzaFactory {
    @Override
    public Pizza createPizza(String type) {
        Pizza pizza = null;
        if ("cheese".equals(type)) {
            pizza = new CheesePizza();
        } else if ("pepperoni".equals(type)) {
            pizza = new PepperoniPizza();
        }
        return pizza;
    }
}

3.5 客户端代码

public class Client {
    public static void main(String[] args) {
        PizzaFactory factory = new SimplePizzaFactory();
        
        Pizza cheesePizza = factory.createPizza("cheese");
        cheesePizza.prepare();
        cheesePizza.bake();
        cheesePizza.cut();
        cheesePizza.box();

        Pizza pepperoniPizza = factory.createPizza("pepperoni");
        pepperoniPizza.prepare();
        pepperoniPizza.bake();
        pepperoniPizza.cut();
        pepperoniPizza.box();
    }
}

 

四、与简单工厂模式的区别

与简单工厂模式相比,工厂方法模式有以下几个区别:

  1. 抽象工厂:工厂方法模式中定义了一个抽象工厂类,具体工厂类继承自抽象工厂类。
  2. 子类实现创建逻辑具体工厂类在子类中实现创建逻辑,而不是在一个静态方法中
  3. 扩展性更好当需要新增产品时,只需要扩展具体工厂类,而不需要修改工厂类的代码

🎈 所谓扩展性好,意思是当我们有新产品时,我们可以再创建一个抽象工厂的子类,而不需要修改原来的子类。简单工厂就需要修改原来的工厂类来解决问题,破环了开闭原则。

      当然了,简单工厂也可以不修改,你说你再建一个工厂再通过静态方法去做,可不可以呢?可以,但是它已经不叫做简单工厂方法了,简单工厂就是一个工厂!相当于你创建了多个工厂,但是这些工厂之间又没有逻辑联系,互相耦合,使得代码混乱。 

      所以,通过抽象工厂作为纽带,创建不同的子类工厂,就完美解决了这个问题。

五、优缺点

5.1 优点

  1. 遵循开闭原则:工厂方法模式遵循开闭原则(OCP),即对扩展开放,对修改关闭。当需要新增产品时,可以通过扩展子类来实现,而不需要修改现有代码。
  2. 封装性好:客户端不需要关心产品的创建细节,只需要调用工厂类的创建方法即可。
  3. 灵活性高:工厂方法模式可以根据条件创建不同的产品,提高了系统的灵活性。

5.2 缺点

  1. 类的个数增加:每增加一个产品,就需要增加一个相应的具体工厂类。
  2. 具体工厂与产品紧密耦合:具体工厂与具体产品之间存在紧密的耦合关系,一旦具体产品发生变化,可能需要修改相应的具体工厂类。

六、总结

工厂方法模式是一种非常实用的设计模式,它通过定义一个创建对象的接口,让子类决定实例化哪一个类。这种方式不仅提高了代码的灵活性和可扩展性,还遵循了开闭原则。在实际开发中,工厂方法模式可以广泛应用于需要创建多种相关对象的场景,尤其是在对象创建逻辑较为复杂的情况下。

 


http://www.kler.cn/a/373451.html

相关文章:

  • 基于单片机的智能家居排气扇系统设计
  • css 对称按钮,中间斜平行间隔,两头半圆
  • 排序算法汇总
  • JavaScript中this的指向和改变this指向的方法 - 2024最新版前端秋招面试短期突击面试题【100道】
  • LVGL实现按键和点击事件
  • 短视频矩阵系统源码开发分享/源代码部署/oem贴牌搭建分享
  • 前端部署指南:手把手教你部署 Vue 项目
  • 开源团队协作利器Focalboard本地部署与异地远程使用
  • 信息管理与信息系统专业的建设与发展 ——人才培养模式探讨
  • 【网络原理】HTTPS
  • solidworks学习6吊环-20241030
  • 前端性能优化之Canvas优化
  • 【网络】套接字编程——TCP通信
  • C#运算符与表达式详解
  • 17_计划任务:at和crontab命令详解
  • ‘’‘’笔记
  • transformControls THREE.Object3D.add: object not an instance of THREE.Object3D.
  • 【K8S】kubernetes-dashboard.yaml
  • 自动化结账测试:使用 Playwright确保电商支付流程的无缝体验【nodejs]
  • docker 相关操作命令
  • 厨艺交流平台:Spring Boot技术实现细节
  • Pyhon中串口通信详解
  • 【Nginx系列】499错误
  • word试题转excel(一键转写excel,无格式要求)
  • 【C++】哈希表模拟:闭散列技术与哈希冲突处理
  • HTML入门教程18:HTML类