java中的工厂方法模式(先把模板方法模式看透)

本文深入讲解工厂方法模式的实际应用,并通过具体的数据库连接示例代码,展示了如何利用此模式实现类的解耦及灵活扩展。

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

以下是我对工厂方法模式的理解。工厂方法模式是我在实际开发中遇到过的,也是使用次数最多的模式。此文中举的例子就是我在工作中实际用到的。


记住!只要是Factory Method模式,在生成实例时就一定会使用到Template Method模式。


public abstract class Factory {
    //这里用了 template method 模式
    //只要是factory method 模式,在生成实例时就一定会使用到template method模式
    //简单的说就是工厂负责提供生产所需的 生产线,配方
    //真正的零件要实体类来提供

    //这个就是生产线
    public final Database create(String databaseType) {
        Database database = createDatabase(databaseType);
        getConnection(database);
        return database;
    }
    //这个是配方,注意,配方不是真正的材料
    public abstract Database createDatabase(String databasetype);
    public abstract void getConnection(Database database);

}

public abstract class Database {

    //Database类都需要一个用于获取连接的方法
    public abstract void Connection();
    //当然我这里还可以定义一个方法
    //public abstract void close();这里就不再次举例了
}

public class DatabaseFactory extends Factory {

    private Database database;

    @Override
    public Database createDatabase(String databasetype) {
        switch (databasetype) {
            case "Mysql":
                database = new Mysql();
                break;
            case "Oracle":
                database = new Oracle();
                break;
            case "DB2":
                database = new DB2();
                break;
            default:
                database = null;
        }
        return database;
    }

    @Override
    public void getConnection(Database database) {
        //你还可以定义获取数据库连接对象的方法,也是在实现类里面写方法
        database.Connection();
    }
}

public class DB2 extends Database {
    @Override
    public void Connection() {
        System.out.println("我用db2的四大参数,创建了一个DB2的数据库连接");
    }
}

public class Mysql extends Database {
    @Override
    public void Connection() {
        System.out.println("我用Mysql的四大参数,创建了一个Mysql的数据库连接");
    }
}

public class Oracle extends Database {
    @Override
    public void Connection() {
        System.out.println("我用oracle的四大参数,创建了一个oracle的连接");
    }
}

    public static void main(String[] args) {

        //注意,我这里生产实际对象都是factory类对象的方法
        //假如我这个main方法是一个接口,那我只要参数不同,创建的对象就不同
        //看着没?生成Mysql类的实例却没有依赖Mysql类本身,这就是常说的解耦
        Factory factory = new DatabaseFactory();
        Database database1 = factory.create("Mysql");
        Database database2 = factory.create("Oracle");
        Database database3 = factory.create("DB2");

    }
}



下面再说一下:
生成实例的三种实现方式
1.指定其为抽象方法:
指定其为抽象方法,一旦将createDatabase指定为抽象方法后,子类就必须实现该方法。如果子类不实现该方法,编译器将会报错。
abstract class Factory{
public abstract Database createDatabase(String name)
}

2.为其实现默认处理
为其实现默认处理,实现默认处理后,如果子类没有实现该方法,将进行默认处理。不过这时使用new关键字创建出实例的,因此不能将Database类定义为抽象类
class Factory{
public Database createDatabase(String name){
return new Database(name);
}
}

3.在其中抛出异常
在其中抛出异常的方法。createDatabase方法的默认处理为抛出异常,这样一来,如果未在子类中实现该方法,程序就会在运行时出错
class Factory{
public Database createDatabase(String name){
throw new FactoryMethodRuntimeException();
}
}
不过需要另外编写FactoryMethodRuntimeException异常类


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值