Java 设计模式系列:简单工厂模式

简介

简单工厂模式(Simple Factory Pattern)是一种常用的设计模式,属于创建型模式。又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。它提供了一种创建对象的最佳方式。在简单工厂模式中,有一个专门的工厂类负责创建其他类的实例,而客户端无需知道所创建对象的详细信息。工厂类负责实现创建所有实例的内部逻辑,可以创建具有共同父类的不同类的新实例。

在实现上,简单工厂模式的UML类图包含一个工厂类(Creator)、一个抽象产品(Product)和一个具体产品(Concrete Product)。工厂类根据传入的参数动态决定应该创建哪一个产品类的实例。抽象产品是所有创建对象的父类,它负责描述所有实例所共有的公共接口。具体产品是抽象产品的具体实现,是简单工厂模式的创建目标。

简单工厂模式的适用场景包括工厂类负责创建的对象比较少,客户端只需要知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。这种模式有助于减少客户端代码的复杂度,使得客户端无需了解对象的创建细节。

简单工厂模式的优点包括:客户端只需要传入一个正确的参数,就可以获取所需的对象,而无需关心对象的创建细节;工厂类可以封装对象的创建逻辑,客户端无需了解对象的具体创建过程。然而,简单工厂模式的缺点也很明显:工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背了开闭原则;如果工厂类异常,可能会导致整个系统的异常。

示例

首先,定义一个抽象产品类 Product,以及两个具体产品类 ConcreteProductAConcreteProductB,它们都实现了 Product 接口:

java 复制代码
// 抽象产品类  
public interface Product {  
    void use();  
}  
  
// 具体产品类A  
public class ConcreteProductA implements Product {  
    @Override  
    public void use() {  
        System.out.println("使用具体产品A");  
    }  
}  
  
// 具体产品类B  
public class ConcreteProductB implements Product {  
    @Override  
    public void use() {  
        System.out.println("使用具体产品B");  
    }  
}

接下来,定义工厂类 SimpleFactory,它负责根据客户端的需求创建具体产品对象:

java 复制代码
// 工厂类  
public class SimpleFactory {  
    // 使用静态方法,不需要创建工厂实例  
    public static Product createProduct(String type) {  
        if ("A".equalsIgnoreCase(type)) {  
            return new ConcreteProductA();  
        } else if ("B".equalsIgnoreCase(type)) {  
            return new ConcreteProductB();  
        } else {  
            return null;  
        }  
    }  
}

最后,客户端代码使用工厂类来获取产品对象,并调用其方法:

java 复制代码
public class Client {  
    public static void main(String[] args) {  
        // 客户端只需要知道传入工厂类的参数,无需了解创建细节  
        try{
           do{
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input product type:");
            String type = reader.readLine();
            Product product = SimpleFactory.createProduct(type);   
            if(product!=null){
               // 使用产品  
               product.use();  
            }
             else {
                break;
             }
           }while(true);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }  
}

运行客户端代码后,输出将会是:

使用具体产品A  
使用具体产品B
相关推荐
ok!ko3 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2402_857589363 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰4 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
拉里小猪的迷弟4 小时前
设计模式-创建型-常用:单例模式、工厂模式、建造者模式
单例模式·设计模式·建造者模式·工厂模式
哎呦没4 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥5 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程6 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇6 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
严文文-Chris6 小时前
【设计模式-中介者模式】
设计模式·中介者模式
刷帅耍帅6 小时前
设计模式-中介者模式
设计模式·中介者模式