背景
假设你是一家汽车制造公司,你的工厂可以生产不同类型的汽车,比如轿车和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加速
示例二
下面我们来举一个实际应用中的场景实例,假设我们要创建一个图形绘制的程序,其中可以绘制不同形状的图形,如圆形、矩形、三角形等。如果每次创建图形对象时都需要明确指定要创建哪种对象,那么这将是一项繁琐的任务,而且如果需要添加新的图形类型,就需要修改程序中的实现,这是不可取的。因此,我们可以使用工厂模式来解决这个问题,具体步骤如下:
- 定义
Shape
接口,表示可绘制的图形形状,并定义draw()
方法用于绘制图形。 - 定义几个类,分别实现
Shape
接口,表示不同的图形形状,如Circle
、Rectangle
、Triangle
等。 - 定义一个工厂接口
ShapeFactory
,其中定义一个getShape()
方法,用于根据输入的图形形状类型字符串返回对应的Shape
对象。 - 定义一个工厂类
ShapeFactoryImpl
,实现ShapeFactory
接口,具体实现getShape()
方法,根据输入的图形形状类型字符串返回对应的Shape
对象。 - 在业务代码中,通过调用
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