深入理解java三种工厂模式

深入理解Java三种工厂模式

工厂设计模式概述

工厂设计模式是一种常见的创建型设计模式,它提供了一个创建对象的接口,但是允许子类决定实例化哪个类。工厂模式可以将对象的实例化过程从客户代码中分离出来,从而实现了松耦合,提高了代码的可维护性和可扩展性。

Java中有三种工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式。接下来我们将逐一解析这三种模式。

简单工厂模式

定义

简单工厂模式(Simple Factory Pattern)又称为静态工厂方法模式(Static Factory Method Pattern),它属于创建型模式。

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。

示例

  1. 首先定义一个形状接口(Shape)和其实现类圆形(Circle)、正方形(Square)和长方形(Rectangle)
// Shape
public interface Shape {
    void draw();
}

// Circle
public class Circle implements Shape {
    public void draw() {
        System.out.println("画圆形");
    }
}

// Square
public class Square implements Shape {
    public void draw() {
        System.out.println("画正方形");
    }
}

// Rectangle
public class Rectangle implements Shape {
    public void draw() {
        System.out.println("画长方形");
    }
}
  1. 创建一个简单工厂类(ShapeFactory),它用于根据传入的参数(shapeType)创建对应的形状对象
public class ShapeFactory {
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
}
  1. 调用简单工厂类来创建形状对象,并调用draw方法
ShapeFactory shapeFactory = new ShapeFactory();

Shape circle = shapeFactory.getShape("CIRCLE");
circle.draw();

Shape square = shapeFactory.getShape("SQUARE");
square.draw();

Shape rectangle = shapeFactory.getShape("RECTANGLE");
rectangle.draw();

输出结果:

画圆形
画正方形
画长方形

工厂方法模式

定义

工厂方法模式(Factory Method Pattern)又称为工厂模式,它属于创建型模式。

工厂方法模式的核心是一个抽象工厂类,而具体的产品实现则由具体的工厂类负责生产。

示例

  1. 定义一个形状接口(Shape)和它的实现类圆形(Circle)、正方形(Square)和长方形(Rectangle)
// Shape
public interface Shape {
    void draw();
}

// Circle
public class Circle implements Shape {
    public void draw() {
        System.out.println("画圆形");
    }
}

// Square
public class Square implements Shape {
    public void draw() {
        System.out.println("画正方形");
    }
}

// Rectangle
public class Rectangle implements Shape {
    public void draw() {
        System.out.println("画长方形");
    }
}
  1. 创建一个形状工厂接口(ShapeFactory)和其实现类圆形工厂(CircleFactory)、正方形工厂(SquareFactory)和长方形工厂(RectangleFactory)。
// ShapeFactory
public interface ShapeFactory {
    Shape createShape();
}

// CircleFactory
public class CircleFactory implements ShapeFactory {
    public Shape createShape() {
        return new Circle();
    }
}

// SquareFactory
public class SquareFactory implements ShapeFactory {
    public Shape createShape() {
        return new Square();
    }
}

// RectangleFactory
public class RectangleFactory implements ShapeFactory {
    public Shape createShape() {
        return new Rectangle();
    }
}
  1. 调用具体的工厂类来创建形状对象,并调用draw方法
ShapeFactory circleFactory = new CircleFactory();
Shape circle = circleFactory.createShape();
circle.draw();

ShapeFactory squareFactory = new SquareFactory();
Shape square = squareFactory.createShape();
square.draw();

ShapeFactory rectangleFactory = new RectangleFactory();
Shape rectangle = rectangleFactory.createShape();
rectangle.draw();

输出结果:

画圆形
画正方形
画长方形

抽象工厂模式

定义

抽象工厂模式(Abstract Factory Pattern)又称为工具箱模式,它是一种设计模式,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。

如果一个系统中的产品种类需要经常扩展,那么抽象工厂模式是最适合的设计模式。

示例

  1. 定义一个形状接口(Shape)和颜色接口(Color)以及它们的实现类圆形(Circle)、正方形(Square)、长方形(Rectangle)、红色(Red)、绿色(Green)和蓝色(Blue)
// Shape
public interface Shape {
    void draw();
}

// Circle
public class Circle implements Shape {
    public void draw() {
        System.out.println("画圆形");
    }
}

// Square
public class Square implements Shape {
    public void draw() {
        System.out.println("画正方形");
    }
}

// Rectangle
public class Rectangle implements Shape {
    public void draw() {
        System.out.println("画长方形");
    }
}

// Color
public interface Color {
    void fill();
}

// Red
public class Red implements Color {
    public void fill() {
        System.out.println("填充红色");
    }
}

// Green
public class Green implements Color {
    public void fill() {
        System.out.println("填充绿色");
    }
}

// Blue
public class Blue implements Color {
    public void fill() {
        System.out.println("填充蓝色");
    }
}
  1. 创建一个抽象工厂类(AbstractFactory),它具有创建形状对象(createShape)和创建颜色对象(createColor)的抽象方法。
public abstract class AbstractFactory {
    abstract Shape createShape(String shapeType);
    abstract Color createColor(String colorType);
}
  1. 创建形状工厂类(ShapeFactory)和颜色工厂类(ColorFactory),它们都继承了抽象工厂类,分别实现了创建形状对象和颜色对象的方法。
public class ShapeFactory extends AbstractFactory {
    public Shape createShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }

    public Color createColor(String colorType) {
        return null;
    }
}

public class ColorFactory extends AbstractFactory {
    public Shape createShape(String shapeType) {
        return null;
    }

    public Color createColor(String colorType) {
        if (colorType.equalsIgnoreCase("RED")) {
            return new Red();
        } else if (colorType.equalsIgnoreCase("GREEN")) {
            return new Green();
        } else if (colorType.equalsIgnoreCase("BLUE")) {
            return new Blue();
        }
        return null;
    }
}
  1. 创建工厂创造器(FactoryProducer)来获取形状工厂或颜色工厂的实例。
public class FactoryProducer {

    public static AbstractFactory getFactory(String choice) {

        if (choice.equalsIgnoreCase("SHAPE")) {
            return new ShapeFactory();
        } else if (choice.equalsIgnoreCase("COLOR")) {
            return new ColorFactory();
        }

        return null;
    }
}
  1. 调用工厂创造器的静态方法getFactory() 来获取具体的工厂,并通过该工厂创建形状和颜色对象,并调用对应的方法。
//获取形状工厂
AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");

//获取形状为圆形的对象,并调用draw方法
Shape circle = shapeFactory.createShape("CIRCLE");
circle.draw();

//获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");

//获取颜色为红色的对象,并调用fill方法
Color red = colorFactory.createColor("RED");
red.fill();

输出结果:

画圆形
填充红色

总结

以上就是Java中的三种工厂模式的详细介绍和实现示例。简单工厂模式适用于简单情况下的对象创建,工厂方法模式适用于需要更好的代码扩展性的情况,抽象工厂模式适用于需要实现多个产品接口的复杂情况。根据业务需求来选择适合的工厂模式是非常有必要的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解java三种工厂模式 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 关于在Java中使用预定义类

    在Java中,预定义类是指Java标准库中提前定义好的一组类,它们负责完成一些常见的任务,例如字符串操作、时间日期处理等。使用Java预定义类可以大大简化编程过程,提高代码的可读性和可维护性。下面是在Java中使用预定义类的攻略: 1. 导入预定义类 Java标准库中的预定义类已经被编译成Java API文档,可以直接使用。但是,在使用预定义类之前,需要导入…

    Java 2023年5月26日
    00
  • 使用jackson实现对象json之间的相互转换(spring boot)

    下面是使用Jackson库实现对象和JSON格式的相互转换的完整攻略。 前置条件 本文需要你已经掌握Spring Boot框架的基础知识,并且对于Java对象与JSON的基础知识有所了解。 介绍 Jackson是一个Java库,用于将Java对象序列化为JSON格式的字符串,并将JSON格式的字符串反序列化为Java对象。Jackson支持在Java对象和J…

    Java 2023年5月26日
    00
  • Java 中EasyExcel的使用方式

    下面是Java中EasyExcel的使用方式的完整攻略: 1. 简介 EasyExcel是一款基于Java开发的、功能强大的Excel读写解决方案,使用起来方便快捷,支持读写Excel、CSV、HTML、JSON等文件格式,并且具有高性能,内存消耗低等优点,是目前比较流行的Excel读写工具之一。 2. 如何使用 2.1 引入依赖 在项目中引入EasyExc…

    Java 2023年6月2日
    00
  • 常见的线程池调度算法有哪些?

    以下是关于常见的线程池调度算法的完整使用攻略: 常见的线程池调度算法 常见的线程调度算法以下几种: 1. 固定大小线程池 固定大小线程池是指线程池中的线程数量是固定的,不随着任务的增加而增加。当线程池中的线程都在执行任务时,新的任务会被放入任务队列中等待。 以下是一个使用固定大小线程池的示例: ExecutorService executorService …

    Java 2023年5月12日
    00
  • docker常用命令

    一、Docker基本概念 1.镜像(Image) Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。 docker的镜像是由 镜像名+版本 组成的。如果没有指定镜像名没有指定版本,默认是…

    Java 2023年4月23日
    00
  • vuejs 动态添加input框的实例讲解

    下面是关于“vuejs 动态添加input框的实例讲解”的完整攻略: 1. 需求分析 在编写一个表单页面时,通常需要动态添加表单项,比如当用户需要输入多个电话号码时,我们需要在页面上动态添加多个电话输入框。这时我们可以使用 Vue.js 来实现动态添加 input 框。 2. 实现动态添加 input 框的步骤 2.1 定义数据 我们需要定义一个数组来存储 …

    Java 2023年6月15日
    00
  • 如何修改JSON字符串中的敏感信息

    如何修改JSON字符串中的敏感信息 在处理JSON数据时,有时我们需要修改敏感信息,如密码、私密令牌等,以保障数据的安全性。在这里我将讲解如何修改JSON字符串中的敏感信息的完整攻略。 方式一:手动替换 最简单直接的方法就是手动替换,通过查找和替换工具,将JSON字符串中的敏感信息手动修改。例如,需要修改以下JSON字符串中的密码信息: { "us…

    Java 2023年5月27日
    00
  • 如何基于SpringBoot部署外部Tomcat过程解析

    准备工作 在开始部署外部Tomcat之前,我们需要先准备好以下几点: 安装好Java环境,并配置好环境变量; 下载并解压Tomcat,建议下载Tomcat 9.x 版本; 新建一个Spring Boot项目,并配置好pom.xml文件,引入所需的相关依赖。 配置外部Tomcat与Spring Boot项目的关联 接下来,我们要将Spring Boot项目部署…

    Java 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部