【设计模式|创建型】工厂模式(Factory Pattern)

背景

假设你是一家汽车制造公司,你的工厂可以生产不同类型的汽车,比如轿车和SUV。每种类型的汽车都有自己的特点和功能,但它们都是汽车的一种。

概述

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的方式,而无需指定具体的类。工厂模式通过使用工厂方法来创建对象,将对象的创建与使用分离开来,可以简化对象的创建过程。主要包括以下几个角色:

  • 抽象工厂(Abstract Factory):定义了一个创建对象的抽象方法或接口。
  • 具体工厂(Concrete Factory):实现抽象工厂接口,负责具体的产品创建。
  • 抽象产品(Abstract Product):定义了产品的抽象方法或接口。
  • 具体产品(Concrete Product):实现抽象产品接口,是具体工厂创建的对象。

示例一

以汽车制造公司为例

首先,我们需要定义一个汽车接口,它包含了汽车的一些共同的方法,比如启动和加速:

public interface Car {
    void start();
    void accelerate();
}

然后,我们定义两个具体的汽车类,分别是轿车和SUV,它们分别实现了汽车接口:

public class Sedan implements Car {
    @Override
    public void start() {
        System.out.println("启动轿车");
    }

    @Override
    public void accelerate() {
        System.out.println("轿车加速");
    }
}

public class SUV implements Car {
    @Override
    public void start() {
        System.out.println("启动SUV");
    }

    @Override
    public void accelerate() {
        System.out.println("SUV加速");
    }
}

接下来,我们需要定义一个汽车工厂,它负责根据客户的需求来生产汽车:

public class CarFactory {
    public Car createCar(String type) {
        if (type.equalsIgnoreCase("sedan")) {
            return new Sedan();
        } else if (type.equalsIgnoreCase("suv")) {
            return new SUV();
        } else {
            throw new IllegalArgumentException("Unsupported car type: " + type);
        }
    }
}

最后,我们可以使用汽车工厂来创建不同类型的汽车:

public class Main {
    public static void main(String[] args) {
        CarFactory factory = new CarFactory();

        Car sedan = factory.createCar("sedan");
        sedan.start();
        sedan.accelerate();

        Car suv = factory.createCar("suv");
        suv.start();
        suv.accelerate();
    }
}

运行结果:

启动轿车
轿车加速
启动SUV
SUV加速

示例二

下面我们来举一个实际应用中的场景实例,假设我们要创建一个图形绘制的程序,其中可以绘制不同形状的图形,如圆形、矩形、三角形等。如果每次创建图形对象时都需要明确指定要创建哪种对象,那么这将是一项繁琐的任务,而且如果需要添加新的图形类型,就需要修改程序中的实现,这是不可取的。因此,我们可以使用工厂模式来解决这个问题,具体步骤如下:

  1. 定义 Shape 接口,表示可绘制的图形形状,并定义 draw() 方法用于绘制图形。
  2. 定义几个类,分别实现 Shape 接口,表示不同的图形形状,如 CircleRectangleTriangle 等。
  3. 定义一个工厂接口 ShapeFactory,其中定义一个 getShape() 方法,用于根据输入的图形形状类型字符串返回对应的 Shape 对象。
  4. 定义一个工厂类 ShapeFactoryImpl,实现 ShapeFactory 接口,具体实现 getShape() 方法,根据输入的图形形状类型字符串返回对应的 Shape 对象。
  5. 在业务代码中,通过调用 ShapeFactory 接口中的 getShape() 方法创建不同的图形对象,并调用 draw() 方法绘制图形。

下面是实现工厂模式的示例代码。

Shape.java 文件:

// 定义 Shape 接口,表示可绘制的图形形状
public interface Shape {
    void draw();
}

Circle.java 文件:

// 实现 Shape 接口,表示圆形
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Circle");
    }
}

Rectangle.java 文件:

// 实现 Shape 接口,表示矩形
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Rectangle");
    }
}

Triangle.java 文件:

// 实现 Shape 接口,表示三角形
public class Triangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Triangle");
    }
}

ShapeFactory.java 文件:

// 定义 ShapeFactory 接口,用于创建不同类型的 Shape 对象
public interface ShapeFactory {
    Shape getShape(String shapeType);
}

ShapeFactoryImpl.java 文件:

// 实现 ShapeFactory 接口,具体实现 getShape() 方法,根据输入的图形形状类型字符串返回对应的 Shape 对象
public class ShapeFactoryImpl implements ShapeFactory {
    @Override
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        switch (shapeType) {
            case "circle":
                return new Circle();
            case "rectangle":
                return new Rectangle();
            case "triangle":
                return new Triangle();
            default:
                return null;
        }
    }
}

Main.java 文件:

public class Main {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactoryImpl();

        // 创建 Circle 对象并绘制
        Shape circle = shapeFactory.getShape("circle");
        circle.draw();

        // 创建 Rectangle 对象并绘制
        Shape rectangle = shapeFactory.getShape("rectangle");
        rectangle.draw();

        // 创建 Triangle 对象并绘制
        Shape triangle = shapeFactory.getShape("triangle");
        triangle.draw();
    }
}

运行结果:

Drawing Circle
Drawing Rectangle
Drawing Triangle 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值