Java简单工厂,工厂方法,抽象工厂模式怎么实现

发布时间:2022-02-23 13:48:22 作者:iii
来源:亿速云 阅读:203

Java简单工厂、工厂方法、抽象工厂模式怎么实现

目录

  1. 引言
  2. 设计模式概述
  3. 简单工厂模式
  4. 工厂方法模式
  5. 抽象工厂模式
  6. 三种工厂模式的比较
  7. 总结

引言

在软件开发中,设计模式是解决常见问题的经典解决方案。工厂模式是创建型设计模式中的一种,主要用于对象的创建。工厂模式可以分为简单工厂模式、工厂方法模式和抽象工厂模式。本文将详细介绍这三种工厂模式的定义、实现方式以及各自的优缺点,并通过Java代码示例进行说明。

设计模式概述

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。

工厂模式属于创建型模式,主要用于对象的创建。工厂模式的核心思想是将对象的创建与使用分离,使得系统更加灵活、可扩展。

简单工厂模式

3.1 定义

简单工厂模式(Simple Factory Pattern)又称为静态工厂方法模式(Static Factory Method Pattern),它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

3.2 实现

下面通过一个简单的例子来说明简单工厂模式的实现。

假设我们有一个图形接口 Shape,以及两个实现类 CircleRectangle。我们需要一个工厂类 ShapeFactory 来根据传入的参数创建不同的图形对象。

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

// 圆形类
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

// 矩形类
class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

// 图形工厂类
class ShapeFactory {
    // 使用 getShape 方法获取形状类型的对象
    public 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;
    }
}

// 使用工厂类创建对象
public class SimpleFactoryPatternDemo {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();

        // 获取 Circle 的对象,并调用它的 draw 方法
        Shape shape1 = shapeFactory.getShape("CIRCLE");
        shape1.draw();

        // 获取 Rectangle 的对象,并调用它的 draw 方法
        Shape shape2 = shapeFactory.getShape("RECTANGLE");
        shape2.draw();
    }
}

3.3 优缺点

优点:

  1. 简单易用:简单工厂模式实现简单,易于理解和使用。
  2. 解耦:将对象的创建与使用分离,降低了系统的耦合度。

缺点:

  1. 扩展性差:如果需要增加新的产品类,需要修改工厂类的代码,违反了开闭原则。
  2. 职责过重:工厂类集中了所有产品的创建逻辑,职责过重,一旦出现问题,整个系统都会受到影响。

工厂方法模式

4.1 定义

工厂方法模式(Factory Method Pattern)又称为虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern),它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。

4.2 实现

下面通过一个例子来说明工厂方法模式的实现。

假设我们有一个日志记录器接口 Logger,以及两个实现类 FileLoggerConsoleLogger。我们需要一个工厂接口 LoggerFactory 和两个具体的工厂类 FileLoggerFactoryConsoleLoggerFactory 来创建不同的日志记录器对象。

// 日志记录器接口
interface Logger {
    void log(String message);
}

// 文件日志记录器
class FileLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("File Logger: " + message);
    }
}

// 控制台日志记录器
class ConsoleLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("Console Logger: " + message);
    }
}

// 日志记录器工厂接口
interface LoggerFactory {
    Logger createLogger();
}

// 文件日志记录器工厂
class FileLoggerFactory implements LoggerFactory {
    @Override
    public Logger createLogger() {
        return new FileLogger();
    }
}

// 控制台日志记录器工厂
class ConsoleLoggerFactory implements LoggerFactory {
    @Override
    public Logger createLogger() {
        return new ConsoleLogger();
    }
}

// 使用工厂方法模式创建对象
public class FactoryMethodPatternDemo {
    public static void main(String[] args) {
        LoggerFactory fileLoggerFactory = new FileLoggerFactory();
        Logger fileLogger = fileLoggerFactory.createLogger();
        fileLogger.log("This is a file log message.");

        LoggerFactory consoleLoggerFactory = new ConsoleLoggerFactory();
        Logger consoleLogger = consoleLoggerFactory.createLogger();
        consoleLogger.log("This is a console log message.");
    }
}

4.3 优缺点

优点:

  1. 扩展性好:增加新的产品类时,只需要增加相应的工厂类,不需要修改现有的代码,符合开闭原则。
  2. 解耦:将对象的创建与使用分离,降低了系统的耦合度。

缺点:

  1. 类的个数增加:每增加一个产品类,就需要增加一个对应的工厂类,导致类的个数增加,系统复杂度提高。
  2. 抽象性增加:引入了抽象层,增加了系统的抽象性和理解难度。

抽象工厂模式

5.1 定义

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂的模式。它属于对象创建型模式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

5.2 实现

下面通过一个例子来说明抽象工厂模式的实现。

假设我们有一个图形接口 Shape 和颜色接口 Color,以及它们的实现类 CircleRectangleRedGreen。我们需要一个抽象工厂接口 AbstractFactory 和两个具体的工厂类 ShapeFactoryColorFactory 来创建不同的图形和颜色对象。

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

// 圆形类
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

// 矩形类
class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

// 颜色接口
interface Color {
    void fill();
}

// 红色类
class Red implements Color {
    @Override
    public void fill() {
        System.out.println("Inside Red::fill() method.");
    }
}

// 绿色类
class Green implements Color {
    @Override
    public void fill() {
        System.out.println("Inside Green::fill() method.");
    }
}

// 抽象工厂接口
abstract class AbstractFactory {
    abstract Shape getShape(String shapeType);
    abstract Color getColor(String colorType);
}

// 图形工厂类
class ShapeFactory extends AbstractFactory {
    @Override
    public 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;
    }

    @Override
    public Color getColor(String colorType) {
        return null;
    }
}

// 颜色工厂类
class ColorFactory extends AbstractFactory {
    @Override
    public Shape getShape(String shapeType) {
        return null;
    }

    @Override
    public Color getColor(String colorType) {
        if (colorType == null) {
            return null;
        }
        if (colorType.equalsIgnoreCase("RED")) {
            return new Red();
        } else if (colorType.equalsIgnoreCase("GREEN")) {
            return new Green();
        }
        return null;
    }
}

// 工厂生成器类
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;
    }
}

// 使用抽象工厂模式创建对象
public class AbstractFactoryPatternDemo {
    public static void main(String[] args) {
        // 获取图形工厂
        AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");

        // 获取 Circle 的对象,并调用它的 draw 方法
        Shape shape1 = shapeFactory.getShape("CIRCLE");
        shape1.draw();

        // 获取 Rectangle 的对象,并调用它的 draw 方法
        Shape shape2 = shapeFactory.getShape("RECTANGLE");
        shape2.draw();

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

        // 获取 Red 的对象,并调用它的 fill 方法
        Color color1 = colorFactory.getColor("RED");
        color1.fill();

        // 获取 Green 的对象,并调用它的 fill 方法
        Color color2 = colorFactory.getColor("GREEN");
        color2.fill();
    }
}

5.3 优缺点

优点:

  1. 扩展性好:增加新的产品族时,只需要增加相应的工厂类,不需要修改现有的代码,符合开闭原则。
  2. 解耦:将对象的创建与使用分离,降低了系统的耦合度。

缺点:

  1. 类的个数增加:每增加一个产品族,就需要增加一个对应的工厂类,导致类的个数增加,系统复杂度提高。
  2. 抽象性增加:引入了抽象层,增加了系统的抽象性和理解难度。

三种工厂模式的比较

模式名称 定义 优点 缺点
简单工厂模式 根据参数的不同返回不同类的实例 简单易用,解耦 扩展性差,职责过重
工厂方法模式 工厂父类负责定义创建产品对象的公共接口,工厂子类负责生成具体的产品对象 扩展性好,解耦 类的个数增加,抽象性增加
抽象工厂模式 围绕一个超级工厂创建其他工厂的模式 扩展性好,解耦 类的个数增加,抽象性增加

总结

工厂模式是创建型设计模式中的一种,主要用于对象的创建。简单工厂模式、工厂方法模式和抽象工厂模式各有优缺点,适用于不同的场景。简单工厂模式适用于产品类较少且不经常变化的场景;工厂方法模式适用于产品类较多且需要扩展的场景;抽象工厂模式适用于产品族较多且需要扩展的场景。

在实际开发中,应根据具体需求选择合适的工厂模式,以提高代码的可维护性和可扩展性。

推荐阅读:
  1. java策略模式和简单工厂方法怎么实现
  2. java抽象工厂模式和工厂方法模式有区别吗

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:vue怎么解决首页加载慢的问题

下一篇:Springboot JPA怎么使用distinct返回对象

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》