以下是我对工厂方法模式的理解。工厂方法模式是我在实际开发中遇到过的,也是使用次数最多的模式。此文中举的例子就是我在工作中实际用到的。
记住!只要是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异常类