工厂方法模式
简单工厂模式违背了开闭原则,而工厂方法模式则是简单工厂模式的进一步深化,其不像简单工厂模式通过一个工厂来完成所有对象的创建,而是通过不同的工厂来创建不同的对象,每个对象有对应的工厂创建。
定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
工厂方法模式的结构
抽象工厂模式提供了一个接口,用于创建一系列相关或相互依赖的对象。通过使用抽象工厂接口及其具体实现,可以将对象的创建与客户端代码分离,从而实现系统的松耦合。抽象工厂模式涉及多个角色:
抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
具体工厂:主要实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
具体产品:实现了抽象产品角色所定义的接口,有具体工厂创建,它同具体工厂一一对应。
一般使用场景
简单实例代码
- // 定义一个图形接口
- interface Shape {
- void draw();
- }
- // 实现两个具体的图形类,分别是 Circle(圆形)和 Rectangle(矩形)
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Drawing a circle");
- }
- }
-
- class Rectangle implements Shape {
- @Override
- public void draw() {
- System.out.println("Drawing a rectangle");
- }
- }
- // 创建一个抽象工厂类 ShapeFactory
- // 定义了一个抽象的工厂方法 createShape,子类将实现这个方法来创建具体的图形对象
- abstract class ShapeFactory {
- abstract Shape createShape();
- }
- // 创建两个具体的工厂类,分别是 CircleFactory 和 RectangleFactory
- // 它们分别实现了 ShapeFactory 并重写了 createShape 方法来返回相应的图形对象
- class CircleFactory extends ShapeFactory {
- @Override
- Shape createShape() {
- return new Circle();
- }
- }
-
- class RectangleFactory extends ShapeFactory {
- @Override
- Shape createShape() {
- return new Rectangle();
- }
- }
- // 使用这些工厂类来创建图形对象
- public class FactoryMethodExample {
- public static void main(String[] args) {
- ShapeFactory circleFactory = new CircleFactory();
- Shape circle = circleFactory.createShape();
- circle.draw();
-
- ShapeFactory rectangleFactory = new RectangleFactory();
- Shape rectangle = rectangleFactory.createShape();
- rectangle.draw();
- }
- }