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

【超简单-Java设计模式2】简单工厂模式

时间:2024-07-01 15:57:18浏览次数:18  
标签:Java 创建 代码 模式 工厂 简单 设计模式 客户端

简单工厂设计模式:概念、Java实现与应用剖析

简单工厂模式,作为设计模式中最直观、易懂的一种,被广泛应用于软件开发中,尤其在需要创建一系列相关或相互依赖对象的场景下。本文将深入探讨简单工厂模式的概念,通过Java代码示例展示其实现,并分析其在实际开发中的使用场景与优缺点。

一、概念介绍

1. 简单工厂模式定义

简单工厂模式属于创建型模式的一种,其核心思想是定义一个用于创建对象的接口,让子类决定实例化哪一个类。简单工厂模式中,这个“工厂”通常是一个静态方法或一个类,它负责根据传入的参数,返回一个实现特定接口或抽象类的实例。这种方式将实例化逻辑集中在一个地方,便于维护和扩展。

2. 关键角色

  • 工厂类(Factory):负责根据传入的参数创建并返回相应的对象。
  • 抽象产品(Product):定义了所有产品类的公共接口或抽象类。
  • 具体产品(Concrete Product):实现了抽象产品的接口或继承了抽象产品类,是工厂类创建的对象。

二、简单工厂模式的Java代码示例

假设我们正在设计一个图形绘制系统,其中包含多种图形(如圆形、矩形等)。我们将使用简单工厂模式来创建这些图形。

1. 定义抽象产品接口

public interface Shape {
    void draw();
}

2. 创建具体产品类

1)创建一个圆形类:

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Circle");
    }
}

2)创建一个矩形类:

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Rectangle");
    }
}

3. 创建工厂类

public class ShapeFactory {
    public static Shape getShape(String shapeType){
        if(shapeType == null){
            return null;
        }        
        if(shapeType.equalsIgnoreCase("CIRCLE")){
        	//调用圆形类,创建一个圆形
            return new Circle();
        } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
        	//调用矩形类,创建一个矩形
            return new Rectangle();
        }
        return null;
    }
}

4. 客户端代码

public class Client {
    public static void main(String[] args) {
    	//使用简单工厂创建圆形
        Shape circle = ShapeFactory.getShape("CIRCLE");
        circle.draw();
		//使用简单工厂创建矩形 
        Shape rectangle = ShapeFactory.getShape("RECTANGLE");
        rectangle.draw();
    }
}

三、简单工厂模式的使用场景

1.产品等级结构简单

当你需要创建的产品等级结构比较简单,即不存在太多产品子类时,简单工厂模式可以很好地发挥作用。这是因为简单工厂模式的核心就是通过一个静态工厂方法来根据传入的参数创建相应的对象实例,如果产品种类过多,工厂类就会变得非常庞大和复杂。

2. 客户端只需使用产品接口

简单工厂模式的一个关键点是客户端代码只需要知道产品接口或抽象类,而不需要知道具体的产品类是如何实现的。这使得客户端代码与产品类的耦合度大大降低。

3. 系统需要动态决定实例化哪个类

当系统在运行时需要根据某种条件或信息来决定创建哪个具体产品类的实例时,简单工厂模式是一个很好的选择。例如,一个系统可能需要根据用户的选择或配置信息来创建不同的数据库连接对象。

4. 创建对象的逻辑较为简单

如果创建对象的逻辑较为简单,没有涉及到复杂的业务逻辑,使用简单工厂模式可以简化代码结构,避免在客户端代码中出现大量的条件判断语句。

5. 系统初期产品数量不多,后期可能扩展

在系统设计初期,如果产品种类不多,但预期将来可能需要添加新的产品种类,可以先使用简单工厂模式。当需要添加新产品时,只需修改工厂类即可,而无需修改客户端代码。

6. 封装创建对象的逻辑

简单工厂模式可以将创建对象的逻辑封装在工厂类中,这样客户端代码就不需要关心对象的创建过程,提高了代码的可读性和可维护性。

四、简单工厂模式的优缺点

【优点】

1. 封装性好:

简单工厂模式将对象的创建和使用分离,客户端代码无需关心具体的创建逻辑,只需要调用工厂类的静态方法即可得到需要的对象。

2. 提高灵活性:

客户端代码只依赖于产品接口,而不需要知道具体的实现类,这使得系统更加灵活,易于扩展和维护。

3. 降低耦合度:

客户端与具体产品类解耦,只需要知道产品接口,这降低了系统的耦合度,提高了系统的可维护性和可扩展性。

4. 易于扩展:

当需要增加新的产品类时,只需修改工厂类的实现,客户端代码无需变动,符合“开闭原则”。

【缺点】

1. 工厂类过于集中:

所有产品的创建逻辑都集中在工厂类中,这会导致工厂类变得庞大和复杂,难以维护。尤其是当产品种类很多时,工厂类的代码会变得非常臃肿。

2. 违反开闭原则:

虽然简单工厂模式在客户端代码上实现了开闭原则,但是工厂类本身并不遵循开闭原则。当系统需要新增产品时,不得不修改工厂类的代码,增加了代码的复杂性和维护成本。

3. 工厂类的职责过重:

工厂类承担了所有的产品创建逻辑,这违背了“单一职责原则”。如果工厂类出错,可能会影响到整个系统。

4. 不适应复杂等级结构:

当产品等级结构较为复杂时,简单工厂模式可能无法很好地处理。例如,当产品存在多个等级结构时,简单工厂模式就需要在工厂类中做复杂的判断逻辑,这会增加代码的复杂度。

总结

简单工厂模式适用于产品种类较少且相对固定的情况,它可以简化客户端代码,提高系统的可维护性和可扩展性。但在产品种类较多或产品结构复杂时,应考虑使用更复杂的设计模式,如 工厂方法 模式或 抽象工厂 模式,以避免工厂类的职责过重和代码过于复杂。

简单动作,深刻联结。在这技术海洋,我备好舟,等你扬帆。启航吧!

标签:Java,创建,代码,模式,工厂,简单,设计模式,客户端
From: https://blog.csdn.net/wcblog/article/details/140102408

相关文章

  • 将 proto 文件转成 java 类
     将proto文件转成java类:将proto文件放在/resource目录下,执行mvnpackage,类会自动生成 <plugin><groupId>com.github.os72</groupId><artifactId>protoc-jar-maven-plugin</artifactId><vers......
  • Java 锁粗化和锁消除
    原文:Java锁消除和锁粗化锁粗化通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽可能短,但是某些情况下,一个程序对同一个锁不间断、高频地请求、同步与释放,会消耗掉一定的系统资源,因为锁的请求、同步与释放本身会带来性能损耗,这样高频的锁请求就反而不利于系......
  • JavaWeb中Session的使用
     Session的工作应用以及工作流程    在浏览器和服务器建立请求访问时,通常会在服务器中开设一个新的JSessionID,用于储存用户的数据,在服务器响应请求后,将JSessionID返回浏览器中,下一次再次进行访问时,浏览器将会直接携带JSessionID进行访问,服务器则直接以此查找Session......
  • 高级java每日一道面试题-2024年7月1日
    题目:请解释Java中的内存泄漏,并说明如何检测和避免内存泄漏。答案:内存泄漏指的是程序中不再使用的对象,由于某些原因没有被垃圾回收器回收,仍然占据着内存空间,导致可用内存逐渐减少,最终可能会导致程序性能下降甚至崩溃。常见的导致内存泄漏的原因包括:长生命周期的对象持......
  • 深入理解Java核心技术模块化局部变量类型推断
    本人详解作者:王文峰,参加过CSDN2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的Java开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯山峯转载说明:务必注明来源(注明:作者:王文峰哦)深入理解Java......
  • 1974Springboot医院远程诊断管理系统idea开发mysql数据库web结构java编程计算机网页源
    一、源码特点 springboot医院远程诊断管理系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSPjava编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。springboot医院远程诊断系统......
  • java简单版学生管理系统(无登录,注册界面)
    学生管理系统按照要求定义学生类属性:id,姓名,年龄,家庭住址publicclassstudent{privateStringid;privateStringname;privateintage;privateStringaddress; //以下内容在IDEA中可以使用快捷键ALT+INSEATpublicstudent(){}......
  • 基于Springboot的电子招投标系统。Javaee项目,springboot项目。
    演示视频:基于Springboot的电子招投标系统。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven+Layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界面简......
  • 基于Springboot的书籍学习平台(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的书籍学习平台(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven+Layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界......
  • Java身份证实名认证、身份证识别接口让您认证任性的“懒”
    “懒”这个字大多时候是贬义的,但是如果利用好“懒”的特点,就能有不一样的效果。最近几年成功的互联网产品,虽然领域不同,但有一个共同的特点:显著降低了用户获得产品和服务的成本,进而取得成功。不可否认,有不少的产品就是利用了用户越来越“懒”的特点。现在比较火的小视频AP......