工厂方法(Factory Method)模式【创建模式第三篇】
工厂方法(Factory Method)模式
1、工厂方法模式是类的创建模式,又叫做虚拟构造子模式或者多态性工厂模式
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
一般而言工厂方法模式的系统设计到以下几种角色:
1) 抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的,
任何在模式之中个窗对象的工厂类必须实现这个接口,在实际系统中,这个角色也使用抽象类实现
2) 具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体java类。
具体工厂角色含有与用应密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
3) 抽象产品角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口,
在实际应用中,这个角色也常常使用抽象java类实现
4) 具体产品角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例
5、举例:问题:某一个商业软件产品需要支持Sybase和Oracle数据库。这个系统需要这样一个查询运行期系统,根据客户需要,可以随时向Sybase和Oracle数据库引擎发出查询答案:可以看出,这个系统是由一个客户端Client,一个抽象工厂角色QueryRunner,两个具体工厂角色SybaseQueryRunner和OracleQueryRunner,以及产品角色组成的对于客户端Client而言,系统的抽象产品角色是ResultSet接口,而具体产品角色就是java.sql.Connection所返还的具体ResultSet对象,createSql()方法和createConnection()方法实际上也是工厂方法,他们的产品是SQL语句和Connection对象//java抽象类QueryRunnerimport java.sql.Connection;import java.sql.ResultSet;public abstract class QueryRunner{public ResultSet run() throws Exception{Connection conn = createConnection();String sql = createSql();return runSql(conn,sql);}protected abstract Connection createConnection();protected abstract String createSql();protected abstract ResultSet runSql(Connection conn.String sql)throws Exception;}//具体工厂类import java.sql.Connection;import java.sql.Statement;import java.sql.ResultSet;public class SybaseQueryRunner extends QueryRunner{public Connection createConnection(){return null;}protected String createSql(){return "select * from customers";}protected ResultSet runSql(Connection conn,String sql) throws Exception{Statement stmt = conn.createStatement();return stmt.executeQuery(sql);}}//具体工厂类import java.sql.Connection;import java.sql.Statement;import java.sql.ResultSet;public class OracleQueryRunner extends QueryRunner{public Connection createConnection(){return null;}protected String createSql(){return "select * from customers";}protected ResultSet runSql(Connection conn, String sql) throws Exception{Statement stmt = conn.createStatement();return stmt.executeQuery(sql);}}//客户端import java.sql.ResultSet;public class Client{private static QueryRunner runner;public static void main(String args[]) throws Exception{runner = new SybaseQueryRunner();ResultSet rs = runner.run();}}以上给出的答案中,使用了模板方法模式,在QueryRunner中,run()方法就是一个模板方法,这个方法代表一个顶极逻辑:返还产寻的结果ResultSet