设计模式学习_工厂方法模式

工厂方法设计模式 Factory Pattern

定义以及抽象层面

  • 工厂方法定义了一种更好地创造对象的方式。但是它让工厂子类来决定怎么创造以及创造哪一个对象。也就是说,工厂模式将创造对象的过程延迟给子类来进行。

它以这两种东西组成:

1. 我们想要创造的对象。

2.我们用来创造这些对象的工厂。

抽象层面的图所示:

在这里插入图片描述
# 我们可以看到:

1. 左边代表的是各个我们需要创建的对象。

2. 右边代表的是我们用什么(工厂)来创建,当然了,根据什么规则来创建这些对象,我们也可以写在工厂中。

具体案例层面以及代码实现

# 现在,我们用可以实现的代码形式来说明:

重要的图如下:

在这里插入图片描述

  • 也就是说,业务场景如下:我们需要创造一个可以画出形状的图形:可以是画出长方形,正方形或者圆形。我们利用工厂类来有逻辑地创造这些类。
  1. 接口 形状 Shape.java

    1
    2
    3
    4
    5
    package com.company.inter;

    public interface Shape {
    void draw();
    }
  2. 具体的实现子类.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package com.company.impl;

    import com.company.inter.Shape;

    public class Circle implements Shape {
    @Override
    public void draw() {
    System.out.println("画出来的是圆形图案...");
    }
    }
1
2
3
4
5
6
7
8
9
10
package com.company.impl;

import com.company.inter.Shape;

public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("画出来的是长方形图案...");
}
}
1
2
3
4
5
6
7
8
9
10
package com.company.impl;

import com.company.inter.Shape;

public class Square implements Shape {
@Override
public void draw() {
System.out.println("画出来的是正方形图案...");
}
}
  1. 创造指定对象的工厂.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package com.company.factory;

    import com.company.impl.Circle;
    import com.company.impl.Rectangle;
    import com.company.impl.Square;
    import com.company.inter.Shape;

    public class ShapeFactory {
    public Shape getShape(String specificShapeName) {
    //定义如何生成对象的逻辑
    if (specificShapeName.equals("Rectangle")) {
    return new Rectangle();
    } else if (specificShapeName.equals("Square")) {
    return new Square();
    }else if (specificShapeName.equals("Circle")) {
    return new Circle();
    }
    return null;
    }
    }
  2. 测试的主函数Main.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package com.company;

    import com.company.factory.ShapeFactory;
    import com.company.inter.Shape;

    public class Main {

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

    //通过指定不同的名字 来创造不同的对象(依照具体的业务场景来定义不同的对象创建规则)
    Shape s1 = shapeFactory.getShape("Circle");
    s1.draw();

    Shape s2 = shapeFactory.getShape("Square");
    s2.draw();
    }
    }

效果图

在这里插入图片描述