首页 > 编程语言 > Java设计模式-简单工厂模式

Java设计模式-简单工厂模式

时间:2023-04-25 10:11:18浏览次数:36  
标签:Product Java 创建 模式 工厂 简单 设计模式 客户端

simple-factory

简介

在软件开发过程中,设计模式是一种被广泛应用的实践,它是通过总结、归纳和提炼出软件设计经验,从而使得设计更加优雅、高效。简单工厂模式是设计模式中最基本、最简单的一种模式,它能够有效地封装对象的创建过程,简化代码结构。

简单工厂模式又称为静态工厂方法模式,它是通过定义一个工厂类,用于创建不同的对象实例,而不是在客户端代码中直接创建对象实例,从而避免了客户端代码与对象的耦合。简单工厂模式是一种创建型模式,它将创建对象的过程封装起来,使得客户端无需知道对象的创建过程,只需要向工厂类请求需要的对象即可。

与其他设计模式相比,简单工厂模式的最大区别在于它只有一个工厂类。其他设计模式可能需要多个工厂类,或者是一组相关的工厂类。例如,抽象工厂模式需要多个工厂类来创建不同的产品系列。

实现

下面是一个简单工厂模式的一个示例:

// 抽象产品类
interface Product {
    void operation();
}

// 具体产品类A
class ConcreteProductA implements Product {
    public void operation() {
        System.out.println("This is ConcreteProductA.");
    }
}

// 具体产品类B
class ConcreteProductB implements Product {
    public void operation() {
        System.out.println("This is ConcreteProductB.");
    }
}

// 工厂类
class Factory {
    public static Product createProduct(String type) {
        if (type.equals("A")) {
            return new ConcreteProductA();
        } else if (type.equals("B")) {
            return new ConcreteProductB();
        } else {
            return null;
        }
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Product productA = Factory.createProduct("A");
        Product productB = Factory.createProduct("B");
        productA.operation();
        productB.operation();
    }
}

上述代码中,我们定义了一个抽象产品类Product,其中包含一个操作方法operation,用于对产品进行操作。然后定义了两个具体产品类ConcreteProductA和ConcreteProductB,分别实现了Product接口中的operation方法。接着,我们定义了一个工厂类Factory,其中包含一个静态方法createProduct,用于创建不同类型的产品。客户端只需要向工厂类请求需要的产品类型,而无需知道具体的产品创建过程。

优缺点

优点:

  • 将对象的创建与使用分离,提高了代码的可维护性。
  • 隐藏了对象的创建细节,使客户端代码更加简洁和易于维护。
  • 可以根据需要动态地创建不同类型的对象,而无需在客户端代码中进行修改。

缺点:

  • 工厂类需要负责创建所有产品,如果产品类型过多,工厂类的代码会变得过于复杂。
  • 新增产品需要修改工厂类的代码,违反了开闭原则。

运用场景

简单工厂模式通常适用于以下场景:

  • 当需要创建的对象具有相同的行为和属性时,可以使用简单工厂模式,因为它可以降低客户端代码的复杂度,提高代码的可维护性和可扩展性;
  • 当一个类不知道它所需要的对象的类时,可以使用简单工厂模式,将创建对象的职责交给工厂类处理;
  • 当需要在客户端中动态地根据条件创建不同的对象时,可以使用简单工厂模式。

总之,简单工厂模式适用于创建对象逻辑比较简单,且客户端只需要知道抽象产品类的情况下。当系统中需要创建的具体产品类不断增多时,使用简单工厂模式会导致工厂类变得过于复杂,此时可以考虑使用工厂方法模式或者抽象工厂模式来解决问题。

总结

简单工厂模式是一种基本、简单的设计模式,它能够有效地封装对象的创建过程,从而简化客户端代码结构。然而,简单工厂模式也有其缺点,如扩展性和可维护性不佳。因此,在使用简单工厂模式时,需要根据具体的情况进行权衡和选择,以达到最佳的设计效果。

标签:Product,Java,创建,模式,工厂,简单,设计模式,客户端
From: https://www.cnblogs.com/xstxjs/p/17351802.html

相关文章

  • 设计模式之模板模式(1)
    定义定义一个操作中的算法骨架而将一些步骤延迟到子类中,模板模式使得子类可以在不改变一算法的结构即可重定义该算法的某些特定步骤。使用场景通用的增删改查代码先来看一下外部jar包的导入。在design上右击选择Properities选择AddExternalJars…导入需要的JAR包这里先写一......
  • 【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介代理模式(ProxyPattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源时,可使用代理模式。访问......
  • GraalVM(云原生时代的Java)和IoT在边缘侧落地与实践
    环顾四周,皆是对手!云时代的掉队者,由于Java启动的高延时、对资源的高占用、导致在Serverless及FaaS架构下力不从心,在越来越流行的边缘计算、IoT方向上也是难觅踪影;Java语言在业务服务开发中孤独求败,但在系统级应用领域几乎是C、C++、搅局者Go、黑天鹅Rust的天下;移动应用、敏捷......
  • JavaScript 正则表达式
    基本使用 //定义正则表达式 constreg=/^\d{4}-\d{1,2}-\d{1,2}$/; conststr="2020-11-11"; //验证字符串是否符合规则 reg.test(str);元字符^表示开始部分等于xxx$表示结束部分等于xxx[]表示字符串中存在中括号中定义的字符,可以使用连字符,如a-z表示可以匹......
  • Java基础
    Java基础Java基础篇JDK和JRE的区别是什么?JDK:JavaDevelopmentKit的简称,java开发工具包,提供了java的开发环境和运行环境。JRE:JavaRuntimeEnvironment的简称,java运行环境,为java的运行提供了所需环境。总结:JDK包含了JRE,同时还包含了编译java源码的编译器......
  • JAVA运算符详解
    JAVA运算字符详解赋值运算符符号作用说明=赋值inta=10;将10赋值给变量a+=加后赋值a+=b;将a+b的值给a-=减后赋值a-=b;将a-b的值给a*=乘后赋值a*=b;将a*b的值给a/=除后赋值a/=b;将a/b的值给a%=取余后赋值a%=b;将a%b的余数......
  • JavaSE笔记——02
    Java流程控制仅仅个人学习记录,不涉及任何商用1.用户交互Scanner从JDK1.5版本之后,专门提供了输入数据类Scanner,此类数据不但可以输入数据,而且也能方便地验证输入的数据。->1.Scanner类概述​ Scanner类可以接收任意的输入流。Scanner类放在java.util包中,其常用的方法......
  • JavaSE笔记——03
    Java方法仅仅个人学习历程记录,不涉及任何商用方法1.方法的定义:一段用来完成特定功能的代码片段,类似于其他语言的函数。2.方法的作用:用于定义该类或该类的实例的行为特征和功能实现3.区别:​ 面向过程中,函数是最基本的单位,整个程序都是由一个个程序组成的​ 面向对象......
  • Java文件操作必备技能,10个小技巧让你快速掌握!
    前言  在我们日常的开发中,文件操作是一个非常重要的主题。文件读写、文件复制、任意位置读写、缓存等技巧都是我们必须要掌握的。在这篇文章中,我将给你们介绍10个实用的文件操作技巧。使用try-with-resources语句处理文件IO流,确保在使用完毕后自动关闭流。使用java.n......
  • JavaSE学习笔记——01
    Java笔记基础仅仅学习,不涉及任何商用1.注释单行注释:以"//"开头多行注释:以"/"开头,以"/"结尾文档注释:以"/**"开头,"*/"结尾。注释中包含一些说明性的文字及一些JavaDoc标签。publicclassHello{publicstaticvoidmain(String[]args){//单行注释......