设计模式 - 工厂方法模式

本文介绍了工厂方法模式,包括抽象产品类定义共性、抽象工厂创建不同具体产品、单例与多工厂模式的区别,以及在JDBC和MyBatis中的应用。适用于目标扩展、保持开闭原则的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

  • 定义一个用于创建对象的 接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类

  • 工厂方法模式属于创建型模式,是工厂模式的一种

  • 工厂方法模式是对简单工厂模式的抽象升级,将工厂这个概念抽象出来成为接口或抽象类,然后针对每种目标实现类创建一个工厂实现,一对一来实现,当新增了目标实现,只要同时新增一个工厂实现即可。

二、实现

在这里插入图片描述
在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;
Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成;

1、工厂方法实现
Ⅰ、代码
// 抽象产品
public abstract class Product { 
    //产品类的公共方法 
    public void method1(){ //业务逻辑处理 }

    //抽象方法 
    public abstract void method2();
}

// 具体产品1
public class ConcreteProduct1 extends Product {
    @Override
    public void method2() {
       //业务逻辑处理 
    }
}
    
// 具体产品2    
public class ConcreteProduct2 extends Product {
    @Override
    public void method2() {
       //业务逻辑处理 
    }
}
// 单工厂模式的抽象工厂
public abstract class Creator {
   /**
    * 创建一个产品对象,其输入参数类型可以自行设置 * 通常为String、Enum、Class等,当然也可以为空
    */
    public abstract <T extends Product> T createProduct(Class<T> c);
}

// 具体工厂类    
public class ConcreteCreator extends Creator {
    public <T extends Product> T createProduct(Class<T> c) {
        Product product = null;
        try {
            product = (Product) Class.forName(c.getName()).newInstance();
        } catch (Exception e) { 
            //异常处理 
        }
        return (T) product;
    }
}

public class Client {
    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();
        Product product = creator.createProduct(ConcreteProduct1.class); 
    }
}
// 多工厂模式的抽象工厂类
public abstract class Creator { 
    public abstract Product createProduct(); 
}

// 产品1具体工厂
public class ConcreteCreator1 extends Creator { 
    public Product createProduct() { 
        return new ConcreteProduct1(); 
    } 
}

// 产品2具体工厂
public class ConcreteCreator2 extends Creator { 
    public Product createProduct() { 
        return new ConcreteProduct2(); 
    } 
}

public class Client {
    public static void main(String[] args) {
        Creator creator = new ConcreteCreator1();
        Product product = creator.createProduct(); 
    }
}
Ⅱ、优点
  • 目标可以无限扩展,工厂类也要随之扩展,一对一存在,满足了开闭原则
Ⅲ、缺点
  • 如果目标实现较多,多工厂模式的实现类也会增多,不简洁

三、使用场景

  • JDBC数据库连接池,在标准SQL的前提下,从MYSQL切换到ORACLE,只需要修改驱动名称即可

  • MyBatis中使用的比较多,事务模块和数据源模块都使用了工厂方法模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值