简单工厂模式

工厂模式是Java常用的设计模式,它提供了一种创建对象的最佳方式,将实例化过程封装在工厂类中,隔离了对象的创建和使用。简单工厂模式包含工厂类、抽象产品类和具体产品类。在示例中,通过工厂类创建酒水产品如矿泉水、饮料和酒。然而,此模式的缺点是扩展困难,不符合开闭原则,且增加新产品需修改工厂类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概述

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,属于创建型模式。

它提供了一种创建对象的最佳方式,即将对象的实例化过程封装在工厂类中,这样做的好处就是可以将对象的创建与使用进行分离,创建对象的过程不对客户暴露,通过使用一个公共的接口来指向新创建的对象。

简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)。

二、模块

  • Factory:工厂类是工厂模式的核心,它负责创建所有实例,也就是构建具体产品的对象,用来创建产品对象的方法一般为静态方法。
  • AbstractProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
  • Product:具体产品类,是简单工厂模式的创建目标

三、示例

假如有一个酒水加工厂,主要生产酒、饮料、矿泉水,这个过程我们就可以使用简单工厂模式。

四、代码

第一步:首先创建产品基类,也就是抽象产品类。

/*
* 抽象产品类
*/
public abstract class Product {
	// 获取产品
    public abstract void getProduct();
}

第二步:创建具体产品类,都继承抽象产品类。

/**
 * 具体产品类 
 *
 */
public class Water extends Product {
    @Override
    public void getProduct() {
        System.out.println("矿泉水");
    }
    
 /**
 * 具体产品类
 */
public class Drinks extends Product {
    @Override
    public void getProduct() {
        System.out.println("饮料");
    }
}
/**
 * 具体产品类
 */
public class Wine extends Product {
    @Override
    public void getProduct() {
        System.out.println("茅子");
    }
}

第三步:创建工厂类,以及静态方法,用来实例化具体产品对象。

/**
 * 工厂类 用来实例化具体产品类
 * 根据type的不同创建不同的对象
 */
public class Factory {
    public static Product createProduct(String type) {
        Product product = null;
        switch (type) {
            case "drink":
                product = new Drinks();
                break;
            case "water":
                product = new Water();
                break;
            case "wine":
                product = new Wine();
                break;    

        }
        return product;
    }
}

五、测试

/**
 - 测试类
 */
public class SimpleFactoryDemoTest {
    public static void main(String[] args) {
        Factory.createProduct("water").getProduct();
        Factory.createProduct("drink").getProduct();
        Factory.createProduct("wine").getProduct();
    }
}

六、思考总结

优点:

  • 该模式下,工厂类中根据必要的判断逻辑,创建对应产品的实例,使得客户端只需要关心使用对应的产品,无需关注对象的创建,实现了责任分割。
  • 其次,客户端也无需知道创建的具体实例化对象,只需要知道简单的数据参数,就可以进行调用。

缺点:

  • 这种模式下,一旦工厂类不能正常工作,整个系统都会受到影响。
  • 其次,每增加一种要生产的商品,就需要新加一个具体产品的实现类,同时也需要修改创建实例化的静态方法,不符合开闭原则(开放扩展关闭修改)。
  • 同时也会增加系统中类的个数,一定程度上增加了系统的复杂度和理解难度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值