摘要:设计模式之工厂模式工厂模式包括了简单工厂工厂方法和抽象工厂。工厂方法模式下面我们针对普通工厂模式的缺点进行优化。
设计模式之工厂模式
工厂模式包括了简单工厂、工厂方法和抽象工厂。下面我从java实际应用的角度分别介绍这三种模式。
简单工厂模式下面看下JDBC中获取Connection的代码
public class ConnectionFactory { public Connection createConnection(String dbType,String serverName,String dbName,String userName,String password) throws SQLException { if(dbType.equalsIgnoreCase("mysql")) { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jdbc:mysql://"+serverName+":3306/"+dbName +"?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"; return DriverManager.getConnection(url,userName,password); } else if(dbType.equalsIgnoreCase("postgresql")) { try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jbdc:postgresql://"+serverName+":5432/"+dbName; return DriverManager.getConnection(url,userName,password); } else if(dbType.equalsIgnoreCase("MariaDB")) { try { Class.forName("org.mariadb.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jdbc:mariadb://"+serverName+":3306/"+dbName; return DriverManager.getConnection(url,userName,password); } else { throw new IllegalArgumentException("未知的dbType参数类型"); } } }
这段代码中就使用了简单工厂模式。我们传入不同的参数类型,工厂内部就会创建不同的对象实例,我们根本不用管工厂内部的实现逻辑是什么。
缺点:违背设计原则:对扩展开放,对修改关闭。因为假如我业务需要新增一个数据库Connection 获取方式就得修改这部分的代码。
下面我们针对普通工厂模式的缺点进行优化。
我们可以定义一个工厂方法接口IConnectionFactory ,包含一个方法,交给子类去实现各自的Connection创建方法
public interface IConnectionFactory { Connection create(String serverName,String dbName,String userName,String password) throws SQLException; }
创建PostgreSqlConnectionFactory工厂并实现IConnectionFactory接口
public class PostgreSqlConnectionFactory implements IConnectionFactory { @Override public Connection create(String serverName, String dbName, String userName, String password) throws SQLException { try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jbdc:postgresql://"+serverName+":5432/"+dbName; return DriverManager.getConnection(url,userName,password); } }
创建MySqlConnectionFactory 工厂并实现IConnectionFactory接口
public class MySqlConnectionFactory implements IConnectionFactory { @Override public Connection create(String serverName, String dbName, String userName, String password) throws SQLException { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jdbc:mysql://" + serverName + ":3306/" + dbName + "?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"; return DriverManager.getConnection(url, userName, password); } }
创建MariaDBConnectionFactory 工厂并实现IConnectionFactory接口
public class MariaDBConnectionFactory implements IConnectionFactory { @Override public Connection create(String serverName, String dbName, String userName, String password) throws SQLException { try { Class.forName("org.mariadb.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } String url = "jdbc:mariadb://"+serverName+":3306/"+dbName; return DriverManager.getConnection(url,userName,password); } }
测试方法
Connection conn = new MySqlConnectionFactory().create("127.0.0.1", "test", "root", "root");
工厂方法模式的优点:新增一种类型,只需增加一个工厂,并实现抽象工厂即可。
缺点就是调用者需要知道调用的子类对象对应的子类工厂。
上述的一个工厂对应一个产品,如果一个工厂对应多个产品那就是我们的抽象工厂模式了。比如 Connection 接口就是应用了抽象工厂模式。其中的方法都是工厂方法,比如:createStatement、prepareStatement、prepareCall等他们都有对应的实现类。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75001.html
摘要:时间年月日星期日说明本文部分内容均来自慕课网。这对所有形态的工厂模式都是重要的这个系统的产品有至少一个的产品族同属于一个产品族的产品是设计成在一起使用的。 时间:2017年08月27日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s...学习源码:https://github.c...
摘要:所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。 0x01.定义与类型 定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口 无需指定它们具体的类 类型:创建型 UML showImg(https://segmentfault.com/img/bVbtBp1?w=800&h=862...
摘要:主要详解简单工厂模式到抽象工厂模式的演变。抽象工厂模式当一个类别的产品还有多个系列区分时,为了按系列生产商品,使用抽象工厂区分。 主要详解简单工厂模式到抽象工厂模式的演变。 简单工厂模式 即静态工厂模式1.将对象的创建和使用分开;2.将生产过程集中,便于集中管理;3.当需要创建的对象类有变动时,就不用在所有new 的地方修改了,直接修改工厂类即可; /** * 简单工厂模式 ---...
阅读 1540·2023-04-26 02:43
阅读 2818·2021-11-11 16:54
阅读 1324·2021-09-23 11:54
阅读 1109·2021-09-23 11:22
阅读 2294·2021-08-23 09:45
阅读 830·2019-08-30 15:54
阅读 3075·2019-08-30 15:53
阅读 3158·2019-08-30 15:53