java设计模式三

工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂模式有几种变体,包括简单工厂模式、工厂方法模式和抽象工厂模式。下面通过一个简化的案例和对Java标准库中使用工厂模式的源码分析来说明这一模式。

简单工厂模式案例

假设我们要创建不同类型的形状(Shape),如圆形(Circle)、正方形(Square)等,但不希望在客户端代码中直接使用`new`关键字来创建具体形状的对象,以保持代码的灵活性和扩展性。

首先定义一个`Shape`接口:

```java

java 复制代码
public interface Shape {
    void draw();
}

```

然后创建几个实现这个接口的具体形状类:

```java

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

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

```

接下来是简单工厂类,它负责根据输入创建具体的形状对象:

```java

java 复制代码
public class ShapeFactory {
    public static Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if ("CIRCLE".equalsIgnoreCase(shapeType)) {
            return new Circle();
        } else if ("SQUARE".equalsIgnoreCase(shapeType)) {
            return new Square();
        }
        // 可以添加更多形状
        throw new IllegalArgumentException("Invalid shape type");
    }
}

```

客户端代码使用工厂来获取形状对象,而无需了解具体创建细节:

```java

java 复制代码
public class SimpleFactoryDemo {
    public static void main(String[] args) {
        Shape circle = ShapeFactory.getShape("CIRCLE");
        circle.draw();

        Shape square = ShapeFactory.getShape("SQUARE");
        square.draw();
    }
}

```

Java标准库中的工厂模式示例:`java.util.Calendar`

Java标准库中的`Calendar`类是一个使用工厂方法模式的例子。它提供了一个静态方法`getInstance()`,该方法返回一个`Calendar`实例,这个实例是根据系统的默认时区和语言环境创建的。

```java

java 复制代码
public class Calendar {
    // 防止实例化
    private Calendar() {}

    public static Calendar getInstance() {
        return createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
    }

    // 实际创建日历实例的私有方法
    private static Calendar createCalendar(TimeZone zone, Locale locale) {
        // 实现细节...
    }
}

```

在这个例子中,`getInstance()`方法就是工厂方法,它隐藏了`Calendar`实例的具体创建逻辑,使得客户端能够以一种统一且易于使用的方式获得`Calendar`对象,同时保持了系统的灵活性和扩展性。

以上展示了工厂模式的基本概念、一个简单的实现案例,以及在Java标准库中的应用示例。在实际应用中,根据项目的复杂度和需求,可以选择合适的工厂模式变体来设计代码结构。

工厂方法模式案例

工厂方法模式与简单工厂模式的主要区别在于,它为每个产品类提供一个对应的工厂类,这样做的好处是当需要添加新产品时,只需要添加相应的产品类和工厂类即可,不需要修改已有的代码,符合开闭原则。

假设我们扩展上面的形状例子,采用工厂方法模式:

首先,定义一个工厂接口:

```java

java 复制代码
public interface ShapeFactory {
    Shape createShape();
}

```

然后,为每种形状创建对应的工厂类:

```java

java 复制代码
public class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

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

```

客户端代码不再直接与具体工厂或产品交互,而是通过工厂接口操作:

```java

java 复制代码
public class FactoryMethodDemo {
    public static void main(String[] args) {
        ShapeFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        circle.draw();

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

```

抽象工厂模式案例

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

假设我们的图形系统除了形状外,还包含颜色。我们可以定义两个接口,一个是形状工厂,另一个是颜色工厂,然后创建一个抽象工厂来组合这两个工厂:

```java

java 复制代码
public interface Color {
    void fill();
}

public class Red implements Color {
    @Override
    public void fill() {
        System.out.println("Filling with Red color");
    }
}

// 省略其他颜色类...

public interface AbstractFactory {
    Shape getShape(String shapeType);
    Color getColor(String colorType);
}

public class ShapeColorFactory implements AbstractFactory {
    @Override
    public Shape getShape(String shapeType) {
        // 实现与简单工厂类似,根据类型返回具体形状
    }

    @Override
    public Color getColor(String colorType) {
        // 根据类型返回具体颜色
    }
}

```

客户端通过抽象工厂来获取形状和颜色:

```java

java 复制代码
public class AbstractFactoryDemo {
    public static void main(String[] args) {
        AbstractFactory factory = new ShapeColorFactory();

        Shape shape = factory.getShape("CIRCLE");
        shape.draw();

        Color color = factory.getColor("RED");
        color.fill();
    }
}

```

总结

  • **简单工厂模式**:一个工厂类负责所有产品的创建,易于使用但不便于扩展和维护。

  • **工厂方法模式**:每个产品都有对应的工厂类,符合开闭原则,易于扩展,但会增加类的数量。

  • **抽象工厂模式**:提供一个接口来创建一系列相关或相互依赖的对象,适合系统中有多组产品族的情况。

选择哪种工厂模式取决于项目需求的复杂度和预期的扩展性。

相关推荐
C137的本贾尼2 分钟前
MySQL 整体架构与存储引擎对比
数据库·mysql·架构
禅思院2 分钟前
大列表性能优化 · 工程实战·四
开发语言·前端·性能优化·前端框架·php·异步加载
rising start3 分钟前
五、Vue3 ref 用法 + Props 完整指南
前端·javascript·vue.js
web打印社区3 分钟前
前端html转换pdf并静默打印pdf最佳实现路径
前端·javascript·vue.js·electron·html
z落落4 分钟前
C# 多接口实现、重名成员、显式实现、接口继承+抽象类和接口区别
java·开发语言·c#
caimouse6 分钟前
Reactos 第 4 章 对象管理 — 4.6 对象的访问控制 / 4.7 句柄的遗传和继承
开发语言·windows·架构
C137的本贾尼12 分钟前
【实战】分析一张真实业务表的 InnoDB 存储结构
java·大数据·数据库
我爱cope13 分钟前
【Agent智能体21 | 构建AI工作流的技巧-优化组件的常用方法】
人工智能·设计模式·语言模型·职场和发展
huangdong_13 分钟前
京东整店商品图片视频批量下载技术:从商品列表到自动分类
开发语言·python·音视频
Curvatureflight13 分钟前
浏览器音频采集实践:麦克风权限、降噪、回声消除与 PCM 转换
前端·javascript·音视频·信息与通信·web·pcm