文章目录

【设计模式】创建型模式:工厂模式

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行

【设计模式】创建型模式:工厂模式_设计模式


简要分析,通过一个 Shape 类,有三个实现的子类,然后针对 Shape 创建一个工厂,实际上使用的时候,直接使用工厂即可,也就是工厂统一管理

基础类

package cn.tellsea.designmode;

/**
* 圆形
*
* @author Tellsea
* @date 2022/9/26
*/
public class Circle implements Shape {

@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
package cn.tellsea.designmode;

/**
* 正方形
*
* @author Tellsea
* @date 2022/9/26
*/
public class Square implements Shape {

@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
package cn.tellsea.designmode;

/**
* 长方形
*
* @author Tellsea
* @date 2022/9/26
*/
public class Rectangle implements Shape {

@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}

上面的三个类,继承下面的统一父类

package cn.tellsea.designmode;

/**
* 形状
*
* @author Tellsea
* @date 2022/9/26
*/
public interface Shape {

/**
* 绘画
*/
void draw();
}

工厂类

构建工厂,根据传入的类型判断,需要构建哪种类型的实例

package cn.tellsea.designmode;

/**
* 形状工厂
*
* @author Tellsea
* @date 2022/9/26
*/
public class ShapeFactory {

/**
* 获取指定类型的对象
*
* @param shapeType
* @return
*/
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (shapeType.equalsIgnoreCase("SQUARE")) {
return new Square();
}
return null;
}
}

测试类

实际调用时,直接使用工厂方法传递参数即可

package cn.tellsea.designmode;

/**
* 工厂模式
*
* @author Tellsea
* @date 2022/9/26
*/
public class FactoryPatternDemo {

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

//获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");

//调用 Circle 的 draw 方法
shape1.draw();

//获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");

//调用 Rectangle 的 draw 方法
shape2.draw();

//获取 Square 的对象,并调用它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");

//调用 Square 的 draw 方法
shape3.draw();
}
}