首页 > 编程语言 >Java的设计模式之工厂模式

Java的设计模式之工厂模式

时间:2023-11-08 12:04:38浏览次数:37  
标签:draw Java 对象 创建 工厂 Shape 设计模式 public

在软件设计中,我们经常遇到需要创建不同类型对象的情况,但是如果直接在代码中实例化对象,会使代码紧密耦合在一起,难以维护和拓展,此外,如果对象的创建方式需要变化,那么就需要再整个代码中进行大量的修改。工厂模式旨在解决这个问题。

工厂模式提供了一个创建对象的接口,但是将具体的对象创建延迟到子类中。这样,客户端代码不需要知道要创建的具体对象的类,只需要通过工厂方法来创建对象。这使得客户端代码与具体对象的创建解耦,提高了代码的灵活性和可维护性。工厂模式中,通常会定义一个抽象工厂类,其中包含一个创建对象的抽象方法,而具体的对象创建则由具体的子类实现。这样每个具体的子类都可以根据需要创建不同类型的对象,而客户端代码只需要通过抽象工厂类来调用工厂方法而不需要关心具体的对象创建细节。

工厂模式的优点包括:

  • 松耦合:客户端代码与具体对象的创建解耦,使得系统更具弹性和可维护性。
  • 扩展性:通过添加新的具体工厂和产品子类,可以很容易的扩展系统以支持新的对象类型。
  • 封装性:将对象的创建集中在工厂类中,封装了对象的创建细节,使得客户端代码更简洁。

工厂模式的缺点包括:

  • 工厂模式会增加系统中类的数量,当产品类型较多时,会导致系统过于庞大和复杂。
  • 工厂模式需要引入抽象层,这会增加系统的抽象性和理解难度。
  • 工厂模式可能会导致类层次过多,增加系统设计难度。

然而,工厂模式也可能引入一些额外的复杂性,因为需要定义多个工厂类和产品类的层次结构,这可能为导致系统中类的数量增加。在选择使用工厂方法模式时,需要根据具体情况进行权衡。工厂模式在实际应用中非常常见,例如,图形库可以使用工厂方法模式来创建不同类型的图形对象,数据库访问框架可以使用工厂模式来创建不同类型的数据库连接等。

工厂模式下又分简单工厂模式和工厂方法模式:

简单工厂模式代码实例:

// Shape接口
public interface Shape {
    void draw();
}

// Circle类
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Draw a circle");
    }
}

// Rectangle类
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Draw a rectangle");
    }
}

// Square类
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Draw a square");
    }
}

// ShapeFactory类
public class ShapeFactory {
    // 静态方法createShape
    public static Shape createShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("circle")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("rectangle")) {
            return new Rectangle();
        } else if (shapeType.equalsIgnoreCase("square")) {
            return new Square();
        }
        return null;
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        // 创建一个圆形对象
        Shape circle = ShapeFactory.createShape("circle");
        // 调用圆形对象的draw方法
        circle.draw();
        // 创建一个矩形对象
        Shape rectangle = ShapeFactory.createShape("rectangle");
        // 调用矩形对象的draw方法
        rectangle.draw();
        // 创建一个正方形对象
        Shape square = ShapeFactory.createShape("square");
        // 调用正方形对象的draw方法
        square.draw();
    }
}

上面的例子中定义了一个Shape接口和三个实现类:Circle,Rectangle,Square,然后定义了ShapeFactory类,并给他定义了一个静态方法createShape,可以根据掺入参数来返回相应的对象。最后我们在客户端使用ShapeFactory来创建不同类型的对象。简单工厂模式实际上就是将实例化类抽离出来,通过传参的形式来判断需要创建哪一个类,并交给工厂类去创建。

工厂方法模式代码实例:

// Shape接口
public interface Shape {
    void draw();
}

// Circle类
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Draw a circle");
    }
}

// Rectangle类
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Draw a rectangle");
    }
}

// Square类
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Draw a square");
    }
}

// 抽象工厂类ShapeFactory
public abstract class ShapeFactory {
    // 抽象方法createShape
    public abstract Shape createShape();
}

// CircleFactory类
public class CircleFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

// RectangleFactory类
public class RectangleFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

// SquareFactory类
public class SquareFactory extends ShapeFactory {
    @Override
    public Shape createShape() {
        return new Square();
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        // 创建一个圆形工厂对象
        ShapeFactory circleFactory = new CircleFactory();
        // 通过圆形工厂对象创建一个圆形对象
        Shape circle = circleFactory.createShape();
        // 调用圆形对象的draw方法
        circle.draw();
        // 创建一个矩形工厂对象
        ShapeFactory rectangleFactory = new RectangleFactory();
        // 通过矩形工厂对象创建一个矩形对象
        Shape rectangle = rectangleFactory.createShape();
        // 调用矩形对象的draw方法
        rectangle.draw();
        // 创建一个正方形工厂对象
        ShapeFactory squareFactory = new SquareFactory();
        // 通过正方形工厂对象创建一个正方形对象
        Shape square = squareFactory.createShape();
        // 调用正方形对象的draw方法
        square.draw();
    }
}

与简单工厂模式不同的是,工厂方法模式没有把不同的类都交给一个工厂去创建,而是针对每个类分别定义了一个工厂类来创建自己的对象,这里分别是:CircleFactory类,RectangleFactory类,SquareFactory类,最后就可以在客户端Client中,通过实例化不同的工厂类来创建不同的对象,在实际场景中,Mybaits中的SqlSessionFactory就是一个典型的简单工厂模式,他会根据传入参数的不同返回SqlSession,再通过SqlSession来执行SQL。

标签:draw,Java,对象,创建,工厂,Shape,设计模式,public
From: https://blog.51cto.com/BakerZhuang/8247682

相关文章

  • java一体化医疗信息管理系统源码:云HIS、云病历、云LIS
    基于云计算技术的B/S架构的HIS系统,为医疗机构提供标准化的、信息化的、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。系统利用云计算平台的技术优势,建立统一的云HIS、云病历、云LIS,有效实现实现协同门诊、住院、药房药库管理、双向转诊转......
  • Java打包镜像部署
    Java打包镜像DockerfileFROMopenjdk:17WORKDIR/opt/data-hubCOPYtarget/data-hub.jar./EXPOSE9843ENTRYPOINT["java","-jar","data-hub.jar"]构建镜像命令dockerbuild-toldweipro/data-hub:latest.运行镜像dockerrun-p9843:9843-......
  • 创建一个 java agent jar 包
    pom.xml文件。(javaagent和main方法的jar可以分开成两个项目,单独打包jar)<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"......
  • javascript 手动实现 bind,call,apply
     js手动实现call方法Function.prototype.myCall=function(content,...args){letmyfn=Symbol()content=content||globalThis//console.log(content)content[myfn]=this//console.log(content)constresu......
  • Java面试题(高频、有答案,全网最强)
    这是一套全网最强的Java面试题,吊打网上所有Java面试题。此套面试题的威力:看过这套题的朋友、同事、粉丝参加了面试后说,他们面试被问到的问题大部分(85%以上)都在这套题里,面试通过率高达90%。这是粉丝的真实评价(聊天截图):有人说这套题题目太多了,我说:着急的可以看频率为两颗星及以上的题......
  • Java学习—Java修饰符
    Java语言提供了很多修饰符,主要分为以下两类:访问修饰符非访问修饰符1、访问控制修饰符Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限。default (即默认,什么也不写):在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、......
  • Java连接服务器的两种方式SFTP和FTP
    https://www.jb51.net/article/276407.htm在项目开发中,一般文件存储很少再使用SFTP服务,但是也不排除合作伙伴使用SFTP来存储项目中的文件或者通过SFTP来实现文件数据的交互,这篇文章主要介绍了Java集成FTP与SFTP连接池−目录区别FtpUtilSFTPUtil问题区别FTP是一种文件传输协议,一般是......
  • JAVA开发(JAVA架构师成长之路)
    从一个最基础的JAVA开发人员成为JAVA架构师,需要经历8层能力的进阶。第一阶段:熟悉JAVA基础语法,学会写各种ifelse和流程语句,熟练使用各种数据类型,集合。能依葫芦画瓢,模仿别人的代码结构,新增类,修改类的信息和逻辑。这个阶段大概是一年的经验。第二阶段:熟悉使用各种开源组件,比如知......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • Java 注释
    单行注释://多行注释:/**/文档注释:/**回车设置单行注释多行注释文档注释的颜色:File→Settings→ColorScheme→Java→Cmomentslinecomment单行注释blockcomment注释区块(多行注释) JavaDoc文档注释 ......