工厂方法模式是简单工厂模式的进一步抽象,相比于简单工厂模式该模式可以在不修改源代码的情况下引入新的产品
优点:
- 用户只需要知道具体工厂的名称就能得到需要的产品,无需知道具体的创建过程
- 灵活性增强,对于新产品的创建,只需要新增一个工厂类
- 满足解偶要求
缺点:
- 类的个数容易变多,系统复杂度增高
- 增加了系统抽象性,和理解难度
应用场景:
- 不关心产品的细节,只关注最产品的品牌
- 创建对象的任务由多个具体的子类工厂完成,抽象工厂则只提供创建产品的接口
工厂方法模式的结构:
- 抽象工厂:提供了创建产品的接口,通过抽象工厂可以访问到具体的某个工厂然后去创建对应的产品
- 具体工厂:实现抽象工厂的方法,完成具体产品的创建
- 抽象产品:定义产品的规范,描述了产品的主要特性和功能
- 具体产品:实现了抽象产品所定义的接口,由具体的工厂创建,它和具体工厂之间相对应
示例:
public class FactoryMethodDemo {
public static void main(String[] args) {
// 只需要知道具体的工厂就可以生产想要的产品
new Factory1().createProduct().show(); //工厂1生成产品1~ // 具体产品1
}
// 抽象产品
interface Product{
void show();
}
// 产品1
static class P1 implements Product{
@Override
public void show() {
System.out.println("具体产品1 ");
}
}
// 产品1
static class P2 implements Product{
@Override
public void show() {
System.out.println("具体产品2 ");
}
}
// 抽象工厂
interface AbstractFactory{
Product createProduct();
}
// 具体工厂1
static class Factory1 implements AbstractFactory{
@Override
public Product createProduct() {
System.out.println("工厂1生成产品1~");
return new P1();
}
}
// 具体工厂2
static class Factory2 implements AbstractFactory{
@Override
public Product createProduct() {
System.out.println("工厂2生成产品2~");
return new P2();
}
}
}