• 设计模式 - 工厂方法模式


    目录

    一、核心概念

    二、组成部分

    三、示例代码

    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 定义产品接口

    1. public interface Pizza {
    2. void prepare();
    3. void bake();
    4. void cut();
    5. void box();
    6. }

    3.2 定义具体产品类

    1. public class CheesePizza implements Pizza {
    2. @Override
    3. public void prepare() {
    4. System.out.println("Preparing Cheese Pizza");
    5. }
    6. @Override
    7. public void bake() {
    8. System.out.println("Baking Cheese Pizza");
    9. }
    10. @Override
    11. public void cut() {
    12. System.out.println("Cutting Cheese Pizza");
    13. }
    14. @Override
    15. public void box() {
    16. System.out.println("Boxing Cheese Pizza");
    17. }
    18. }
    1. public class PepperoniPizza implements Pizza {
    2. @Override
    3. public void prepare() {
    4. System.out.println("Preparing Pepperoni Pizza");
    5. }
    6. @Override
    7. public void bake() {
    8. System.out.println("Baking Pepperoni Pizza");
    9. }
    10. @Override
    11. public void cut() {
    12. System.out.println("Cutting Pepperoni Pizza");
    13. }
    14. @Override
    15. public void box() {
    16. System.out.println("Boxing Pepperoni Pizza");
    17. }
    18. }

     3.3 定义抽象工厂

    1. public abstract class PizzaFactory {
    2. public abstract Pizza createPizza(String type);
    3. }

    3.4 定义具体工厂

    1. public class SimplePizzaFactory extends PizzaFactory {
    2. @Override
    3. public Pizza createPizza(String type) {
    4. Pizza pizza = null;
    5. if ("cheese".equals(type)) {
    6. pizza = new CheesePizza();
    7. } else if ("pepperoni".equals(type)) {
    8. pizza = new PepperoniPizza();
    9. }
    10. return pizza;
    11. }
    12. }

    3.5 客户端代码

    1. public class Client {
    2. public static void main(String[] args) {
    3. PizzaFactory factory = new SimplePizzaFactory();
    4. Pizza cheesePizza = factory.createPizza("cheese");
    5. cheesePizza.prepare();
    6. cheesePizza.bake();
    7. cheesePizza.cut();
    8. cheesePizza.box();
    9. Pizza pepperoniPizza = factory.createPizza("pepperoni");
    10. pepperoniPizza.prepare();
    11. pepperoniPizza.bake();
    12. pepperoniPizza.cut();
    13. pepperoniPizza.box();
    14. }
    15. }

     

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

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

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

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

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

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

    五、优缺点

    5.1 优点

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

    5.2 缺点

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

    六、总结

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

     

  • 相关阅读:
    【学习笔记03】node.js搭建一个简易的服务器
    近端安全互联样例使用指导
    linux crontab 定时任务简单了解
    【ViT(Vision Transformer)】(一) 中英双语
    多线程之一(进程理解、线程理解与创建、Thread类、线程状态)
    大数据必学Java基础(一百一十一):过滤器注解应用和开发案例
    Flink之Watermark水印、水位线
    m基于PTS+TR的OFDM系统PAPR联合抑制算法matlab仿真
    【软件设计原则】CUPID——快乐的编码
    数据分析之Excel的基本功能(下)
  • 原文地址:https://blog.csdn.net/YuanFudao/article/details/143370725