工厂方法模式(Factory Method Pattern)
一种创建型设计模式,它定义了一个用于创建对象
的接口
,让子类决定
将哪一个类实例化
,从而将产品的实例化推迟
到子类中。这种模式的主要角色
包括:
角色1:抽象工厂
(Abstract Factory)。它是工厂方法模式的核心,与应用程序无关,提供
了创建产品的接口
。
角色2:具体工厂
(Concrete Factory)。它是实现
抽象工厂接口的具体工厂类
,负责创建具体
的产品对象。
角色3:抽象产品
(Product)。它是所有对象的超类
,定义了产品的规范
,描述了产品的共同
主要特性和功能
。
角色4:具体产品
(Concrete Product)。它是实现
了抽象产品角色所定义的接口的具体对象
,由专门的具体工厂来创建。
工厂方法模式
的优点
包括:
用户只
需要知道
具体工厂的名称
,就可以得到想要的产品
,无需知道
产品的具体创建过程
。
系统的灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
高层模块只需
要知道产品
的抽象
类,无
须关心其他实现
类,这满足了迪米特法则、依赖倒置原则和里里氏替换原则
。
工厂方法
模式的缺点
包括:
类的个数可能过多
,增加
了系统的复杂度
和理解难度
。
如果抽象产品只能生产一种产品,这可能成为一个限制。
工厂方法模式适用
于以下场景
:
客户
端不关心创建产品的细节
,只关心
创建产品的工厂名
。
一个类
通过其子类
来指定创建
哪个产品对象
。
这种模式是在简单工厂模式上
的改进
,核心工厂类不再负责所有
产品的构建,而是将具体
的工作交给子类
进行实现,不再接触
和业务相关
的具体细节
。
示例:
定义了一个Shape接口
和实现了Shape接口的具体类Circle
。然后定义 了一个工厂类 ShapeFactory,它可以根据参数创建不同
类型的Shape对象
java
//定义形状接口
public interface Shape {
void draw();
}
//圆形类(具体产品实现)
public class Circle implements Shape{
@Override
public void draw() {
System.out.println("Circle::draw()");
}
}
//工厂方法类--根据产品给对象实例化
public class ShapeFactory {
public static Shape getShape(String shapeType){
if (shapeType==null){
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
}
//这里可以添加更多的形状和对应的条件判断
return null;
}
}
//测试类
public class FactoryPatternDemo {
public static void main(String[] args) {
Shape circle =ShapeFactory.getShape("CIRCLE");
if (circle!=null){
circle.draw();
}
//这里可以添加更多的形状测试
}
}