工厂模式
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。工厂模式是我们最常用的实例化对象的方式(除了new以外吧,大部分情况直接new就是了),工厂模式的存在,解决了接口(实际是类)选择的问题。
常用场景
以下是我自己在做项目中常见的使用场景。
-
数据库选择
开发过程中用到多个类型的数据库或同一类型的多个数据库连接。声明数据库通用的接口,将一类数据库的方法封装成一个子类,实现该接口。具体实例化的时候根据需要从配置文件或其他位置获取要实例化的类名,在运行时实例化相应的类。 -
日志记录
记录日志时不确定记录的方式(文件、数据库等) -
session存储方式
session采用文件方式或数据库方式存储 -
自定义表单
从几种表单中选择某项活动需要的表单,每种表单有不同的前台和后台验证方式
实例
/** * 创建一个接口 */ public interface DB { /** * 连接数据库 */ void connect(); } /** * 创建实现接口的类 */ public class Mysql implements DB { @Override public void connect() { System.out.println("mysql connected"); } } public class MsSql implements DB { @Override public void connect() { System.out.println("mssql connected"); } } public class Sqlite implements DB { @Override public void connect() { System.out.println("sqlite connected"); } } /** * 数据库工厂 */ public class DBFactory { public DB getDb(String shapeType) { if (shapeType == null) return null; if (shapeType.equalsIgnoreCase("mysql")) return new Mysql(); else if (shapeType.equalsIgnoreCase("mssql")) return new MsSql(); else if (shapeType.equalsIgnoreCase("sqlite")) return new Sqlite(); return null; } } /** * 执行 */ public static void main(String args[]){ DBFactory factory=new DBFactory();
String dbName=""; DB db=factory.getDb(dbName); db.connect();//只需要知道接口的方法即可调用 }
当需要新建一个数据库类型时,需要新增一个实现DB接口的类,同时在数据库工厂中增加实例化新类的方法,同时只需要修改配置文件中的数据库名称,而不必修改业务逻辑。
当然,实际应用中远没有这么简单。我们可能要给实现类添加不同的参数(比如连接字符串)以保证接口的方法能够正确执行。不过也无非是多定义几个接口的方法而已啦。