常用设计模式2:工厂方法模式(Java)

工厂方法模式(Factory Method Pattern)

1. 简介

工厂方法模式是一种创建型设计模式,它提供了一种将对象的实例化逻辑委托给子类的方法。这种模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法使得一个类的实例化延迟到其子类。

2. 为什么使用工厂方法模式?

  • 解耦:将对象的创建与使用代码分离。
  • 扩展性:可以轻松地增加新产品类型,而无需修改现有代码。
  • 一致性:所有产品遵循同一接口,使得它们可以互相替换。

3. 工厂方法模式的结构

工厂方法模式主要包含以下几个角色:

  1. Product:抽象产品
  2. ConcreteProduct:具体产品
  3. Creator:抽象创建者
  4. ConcreteCreator:具体创建者

4. Java 实现示例

下面通过一个简单的披萨店例子来说明工厂方法模式:

4.1 定义抽象产品(Product)

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

4.2 实现具体产品(ConcreteProduct)

public class CheesePizza implements Pizza {
    public void prepare() { System.out.println("Preparing Cheese Pizza"); }
    public void bake() { System.out.println("Baking Cheese Pizza"); }
    public void cut() { System.out.println("Cutting Cheese Pizza"); }
    public void box() { System.out.println("Boxing Cheese Pizza"); }
}

public class PepperoniPizza implements Pizza {
    public void prepare() { System.out.println("Preparing Pepperoni Pizza"); }
    public void bake() { System.out.println("Baking Pepperoni Pizza"); }
    public void cut() { System.out.println("Cutting Pepperoni Pizza"); }
    public void box() { System.out.println("Boxing Pepperoni Pizza"); }
}

4.3 定义抽象创建者(Creator)

public abstract class PizzaStore {
    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);
        
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        
        return pizza;
    }
    
    // 工厂方法
    protected abstract Pizza createPizza(String type);
}

4.4 实现具体创建者(ConcreteCreator)

public class NYPizzaStore extends PizzaStore {
    @Override
    protected Pizza createPizza(String type) {
        if (type.equals("cheese")) {
            return new CheesePizza();
        } else if (type.equals("pepperoni")) {
            return new PepperoniPizza();
        }
        return null;
    }
}

4.5 客户端代码

public class PizzaTest {
    public static void main(String[] args) {
        PizzaStore nyStore = new NYPizzaStore();
        
        Pizza pizza = nyStore.orderPizza("cheese");
        System.out.println("Ethan ordered a " + pizza.getClass().getSimpleName() + "\n");
        
        pizza = nyStore.orderPizza("pepperoni");
        System.out.println("Joel ordered a " + pizza.getClass().getSimpleName() + "\n");
    }
}

5. 工厂方法模式的优缺点

优点:

  • 符合开闭原则,新增产品时无需修改原有代码。
  • 符合单一职责原则,将创建逻辑集中管理。
  • 客户端代码与具体产品解耦。

缺点:

  • 可能会导致类的数量增加,增加系统的复杂度。
  • 增加了抽象性,增加了理解难度。

6. 适用场景

  • 当一个类不知道它所必须创建的对象的类时。
  • 当一个类希望由其子类来指定它所创建的对象时。
  • 当想要将对象的创建委托给多个子类中的一个时。

7. 总结

工厂方法模式通过将对象的创建延迟到子类,提供了一种灵活的方式来创建对象。它允许系统独立于实际创建的产品,使得添加新产品变得更加容易。在需要处理复杂对象创建逻辑,或者希望将对象创建与使用分离的场景下,工厂方法模式是一个很好的选择。

posted @   KenWan  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示