赞
踩
简单工厂模式、工厂方法模式和抽象工厂模式是面向对象设计中用来实现对象创建灵活性的三种不同形式的工厂模式。它们各自有其特点、适用场景及优缺点。以下是它们之间的区别以及对应的适用场景,以及示例说明:
定义:
简单工厂模式提供一个静态方法或非静态方法,通过接收参数来决定创建并返回何种具体产品对象。这个方法通常存在于一个单独的“工厂”类中,负责处理对象的创建细节。
特点:
适用场景:
示例:
假设有一个图形绘制应用程序,需要创建不同类型的图形(如圆形、矩形、三角形)。可以定义一个ShapeFactory
来根据传入的类型字符串生成相应的Shape
对象:
public interface Shape { void draw(); } public class Circle implements Shape { @Override public void draw() { System.out.println("Drawing a circle"); } } public class Rectangle implements Shape { @Override public void draw() { System.out.println("Drawing a rectangle"); } } public class Triangle implements Shape { @Override public void draw() { System.out.println("Drawing a triangle"); } } public class ShapeFactory { public static Shape createShape(String shapeType) { if ("circle".equals(shapeType)) { return new Circle(); } else if ("rectangle".equals(shapeType)) { return new Rectangle(); } else if ("triangle".equals(shapeType)) { return new Triangle(); } else { throw new IllegalArgumentException("Invalid shape type"); } } } // 使用 Shape circle = ShapeFactory.createShape("circle"); circle.draw();
定义:
工厂方法模式定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。每个子类对应一种具体的产品,负责创建该产品的实例。
特点:
适用场景:
示例:
继续上述图形绘制应用程序的例子,如果产品种类增加且差异较大,可以采用工厂方法模式。首先定义一个抽象工厂接口和各种图形工厂子类:
public interface ShapeFactory { Shape createShape(); } public class CircleFactory implements ShapeFactory { @Override public Shape createShape() { return new Circle(); } } public class RectangleFactory implements ShapeFactory { @Override public Shape createShape() { return new Rectangle(); } } public class TriangleFactory implements ShapeFactory { @Override public Shape createShape() { return new Triangle(); } } // 使用 ShapeFactory circleFactory = new CircleFactory(); Shape circle = circleFactory.createShape(); circle.draw();
定义:
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。客户端使用抽象工厂来创建对象族,而不直接使用具体产品类。
特点:
适用场景:
示例:
假设图形应用程序除了形状之外,还引入了颜色概念,每种形状可以有不同的颜色(如红色圆形、蓝色圆形)。这时可以定义两个产品族:形状(Circle、Rectangle、Triangle)和颜色(Red、Blue)。抽象工厂模式可以创建这两类产品:
public interface Shape { void draw(); } public class RedCircle implements Shape { @Override public void draw() { System.out.println("Drawing a red circle"); } } public class BlueCircle implements Shape { @Override public void draw() { System.out.println("Drawing a blue circle"); } // 其他形状和颜色的实现... } public interface ColorFactory { Color getColor(); } public interface ShapeFactory { Shape getShape(); } public class RedShapeFactory implements ColorFactory, ShapeFactory { @Override public Color getColor() { return new RedColor(); } @Override public Shape getShape() { return new RedCircle(); } } public class BlueShapeFactory implements ColorFactory, ShapeFactory { // 实现相应颜色和形状的创建... } // 使用 ShapeFactory redFactory = new RedShapeFactory(); Shape redCircle = redFactory.getShape(); redCircle.draw();
总结来说,简单工厂模式适用于创建对象逻辑较简单且种类有限的情况;工厂方法模式适用于产品族内产品差异较大且需要保持高度解耦的场景;抽象工厂模式则适用于需要创建一族相关或相互依赖的对象(产品族)的情况。选择使用哪种模式取决于实际项目的需求和复杂度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。