引言
1. 工厂模式的定义
工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。
2. 工厂模式的类型
工厂模式主要有以下几种类型:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
2.1 简单工厂模式
简单工厂模式不是严格意义上的设计模式,因为它并不符合开闭原则。但它提供了一个简单的对象创建机制。
2.1.1 结构
- 产品接口(Product Interface):定义产品的公共接口。
- 具体产品(Concrete Product):实现产品接口的具体类。
- 工厂类(Factory Class):包含创建产品的方法,根据传入的参数返回相应的产品实例。
2.1.2 示例代码
// 产品接口
interface Shape {
void draw();
}
// 具体产品
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");
}
}
// 工厂类
class ShapeFactory {
// 根据传入的形状类型创建相应的形状对象
public static 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 SimpleFactoryDemo {
public static void main(String[] args) {
Shape circle = ShapeFactory.getShape("CIRCLE");
circle.draw();
Shape rectangle = ShapeFactory.getShape("RECTANGLE");
rectangle.draw();
}
}
2.2 工厂方法模式
工厂方法模式定义了一个用于创建对象的接口,但由子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
2.2.1 结构
- 产品接口(Product Interface):定义产品的公共接口。
- 具体产品(Concrete Product):实现产品接口的具体类。
- 工厂接口(Factory Interface):声明创建产品的方法。
- 具体工厂(Concrete Factory):实现工厂接口,创建具体的产品实例。
2.2.2 示例代码
// 产品接口
interface Shape {
void draw();
}
// 具体产品
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");
}
}
// 工厂接口
interface ShapeFactory {
Shape createShape();
}
// 具体工厂
class CircleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
class RectangleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
// 客户端代码
public class FactoryMethodDemo {
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();
}
}
2.3 抽象工厂模式
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2.3.1 结构
- 抽象产品接口(Abstract Product Interface):定义一组产品接口。
- 具体产品(Concrete Product):实现抽象产品接口的具体类。
- 抽象工厂接口(Abstract Factory Interface):声明创建抽象产品的方法。
- 具体工厂(Concrete Factory):实现抽象工厂接口,创建具体的产品实例。
2.3.2 示例代码
// 抽象产品接口
interface Shape {
void draw();
}
interface Color {
void fill();
}
// 具体产品
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");
}
}
class Red implements Color {
@Override
public void fill() {
System.out.println("Filling with Red color");
}
}
class Green implements Color {
@Override
public void fill() {
System.out.println("Filling with Green color");
}
}
// 抽象工厂接口
interface AbstractFactory {
Shape createShape(String shapeType);
Color createColor(String colorType);
}
// 具体工厂
class ShapeFactory implements AbstractFactory {
@Override
public Shape createShape(String shapeType) {
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}
@Override
public Color createColor(String colorType) {
return null;
}
}
class ColorFactory implements AbstractFactory {
@Override
public Shape createShape(String shapeType) {
return null;
}
@Override
public Color createColor(String colorType) {
if (colorType.equalsIgnoreCase("RED")) {
return new Red();
} else if (colorType.equalsIgnoreCase("GREEN")) {
return new Green();
}
return null;
}
}
// 客户端代码
public class AbstractFactoryDemo {
public static void main(String[] args) {
AbstractFactory shapeFactory = new ShapeFactory();
Shape circle = shapeFactory.createShape("CIRCLE");
circle.draw();
AbstractFactory colorFactory = new ColorFactory();
Color red = colorFactory.createColor("RED");
red.fill();
}
}
3. 工厂模式的优点
- 封装性:对象的创建过程被封装在工厂方法中,客户端不需要知道具体的创建细节。
- 解耦:客户端与具体的产品类解耦,可以方便地更换具体的产品类。
- 扩展性:添加新的产品类时,只需扩展工厂类即可,不需要修改现有的代码。
- 一致性:所有对象都通过工厂方法创建,确保了创建的一致性和完整性。
4. 工厂模式的缺点
- 增加复杂度:引入了额外的工厂类,增加了系统的复杂度。
- 单一职责原则:工厂类可能变得非常庞大,违反了单一职责原则。
5. 实际应用场景
- 数据库访问层:根据不同的数据库类型(如 MySQL、Oracle),创建相应的数据库连接对象。
- 日志系统:根据不同的日志级别(如 DEBUG、INFO、ERROR),创建相应的日志记录器。
- 图形界面:根据不同的平台(如 Windows、Linux),创建相应的 UI 控件。