02-简单工厂模式

简单工厂模式

简单工厂模式又叫静态方法模式。因为在简单工厂模式中创建的实例的方法通常为静态(static)方法。

模式的结构与实现

简单工厂模式的主要角色:

  • 简单工厂(SimpleFactory):简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以直接被外部调用,创建所需的产品对象。
  • 抽象产品(AbstractProduct):简单工厂创建对象的所有对象的父类,负责描述所有实例共有的公共接口。
  • 具体产品(Product):简单工厂模式的创建目标。

UML类图

实例

需求:创建一个可以绘制不同形状的绘图工具,可以绘制圆形,正方形,三角形,每个图形都会有一个draw()方法用于绘图。

分析可知正方形,三角形,圆都有一个共同的draw方法,所以在它们的公共父类(AbstractProduct)里声明一个draw方法。
实现代码步骤如下:
  1. 创建产品顶层抽象类,定义具体产品的公共接口AbstractProduct
    1
    2
    3
    public interface AbstractProduct {
    void draw();
    }
  2. 创建具体的产品类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //圆形产品
    public class CircleShape implements AbstractProduct {

    public CircleShape(){
    System.out.println("CircleShape created");
    }

    public void draw() {
    System.out.println("CircleShape 正在绘制圆形图案");
    }
    }
    //正方形产品
    public class RectShape implements AbstractProduct {

    public RectShape(){
    System.out.println("RectShape created");
    }

    public void draw() {
    System.out.println("RectShape 正在正方形图案");
    }
    }
    //三角形产品
    public class TriangleShape implements AbstractProduct {

    public TriangleShape(){
    System.out.println("TriangleShape created");
    }

    public void draw() {
    System.out.println("TriangleShape 正在绘制三角形图案");
    }
    }
  3. 创建工厂类,通过创建静态方法根据传入的参数创建不通产品实例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class SimpleFactory {
    public static AbstractProduct getShape(String type) {
    AbstractProduct shape = null;
    if (type.equalsIgnoreCase("circle")) {
    shape = new CircleShape();
    } else if (type.equalsIgnoreCase("rect")) {
    shape = new RectShape();
    } else if (type.equalsIgnoreCase("triangle")) {
    shape = new TriangleShape();
    }
    return shape;
    }
    }
  4. client根据调用工厂类静态方法,通过不通参数创建不同的产品实例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Client {

    public static void main(String[] args) {
    AbstractProduct circleShape = SimpleFactory.getShape("circle");
    circleShape.draw();
    circleShape = SimpleFactory.getShape("rect");
    circleShape.draw();
    circleShape = SimpleFactory.getShape("triangle");
    circleShape.draw();
    }
    }
  5. 结果输出
1
2
3
4
5
6
CircleShape created
CircleShape 正在绘制圆形图案
RectShape created
RectShape 正在正方形图案
TriangleShape created
TriangleShape 正在绘制三角形图案

总结

优点

  • 将创建实例的工作与使用实例的工作分开,使用者无需关心对象的创建过程,实现了解耦。
  • 把初始化实例的工作放在了工厂里进行,使得代码更容易维护。

缺点

  • 工厂类集中了所有实例的创建逻辑,一旦这个工厂不能正常工作,整个系统会受到影响。
  • 违背开闭原则,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
  • 由于使用了静态工厂方法,静态方法不能被重写和继承,会造成工厂角色无法形成基于继承的等级结构。

应用场景

  1. 客户端不关心对象的创建过程。
  2. 工厂类负责创建的对象(具体产品)比较少。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!