设计模式(2)-简单工厂模式
来源:互联网 发布:linux开启无线网卡状态 编辑:程序博客网 时间:2024/06/05 11:54
工厂模式分为简单工厂模式、工厂模式和抽象工厂模式三种。本来想一篇文章写完来着。结果看来看去,发现其实虽然都叫工厂模式,但是每个模式都不简单。想想算了,还是分开写吧。饭还得一口一口的吃,尽管我已经是一个胖子了。
说实话,真心感觉简单工厂模式其实算是一个异类。不过相比不用简单工厂模式,还是要强一些的。他的先进之处在哪呢?咱们先看代码。
public class OracleHelper { public OracleConnection conn = null; public OracleHelper() { conn = new OracleConnection(); } } public class SQLHelper { public SqlConnection conn = null; public SQLHelper() { conn = new SqlConnection(); } } public class OleHelper { public OleDbConnection conn = null; public OleHelper() { conn = new OleDbConnection(); } }
这是三个数据连接的类。如果使用平常的方式,那么我获取connection对象的话,就需要采用如下的方式获取了。
OracleConnection oraConn = new OracleHelper().conn; SqlConnection sqlConn = new SQLHelper().conn; OleDbConnection oleConn = new OleHelper().conn;
如果,增加一个新的数据库,那就悲催了。需要把所有的代码全部改一遍,这样好么?骚年,千万别以为那是以后的事。你如果这么想,那么很可能你就会掉进自己的挖的坑里。可能就在明天,你就需要改变的程序了。那样,你就悲催了。哇哈哈哈。
那么怎么做呢?简单工厂模式,可以让你的调用简单了那么一点点,只要通过一个参数就可以实现了。那么,如何实现呢。只需要增加一个简单工厂类。
public class ConnFactory { public static IDbConnection CreateDbConnection(string strType) { IDbConnection conn = null; switch (strType) { case "SQLSERVER": conn = new SQLHelper().conn; break; case "ORACLE": conn = new OracleHelper().conn; break; case "ACCESS": conn = new OleHelper().conn; break; default: throw new Exception("数据库类型目前不支持!"); } return conn; } }
这样的话,我只要这样调用就可以了。
IDbConnection oraConn = ConnFactory.CreateDbConnection("ORACLE"); IDbConnection sqlConn = ConnFactory.CreateDbConnection("SQLSERVER"); IDbConnection oleConn = ConnFactory.CreateDbConnection("ACCESS");
这样好些了吧?需要什么类型的数据库连接,只要传参数过去就可以了。
但是,如果要新增数据库的话,就需要修改ConnFactory类中的CreateDbConnection方法了。
这样貌似也不是很好。而且还记得我们的设计原则么?对扩展开放,对修改封闭。这样貌似也不太好。
这就是简单工厂模式的缺点了。
简单工厂模式的优点是:
1、实现了创建和使用分离;
2、调用方无需知道所创建的类的类名,只需要知道所对应的参数即可。
但是缺点也是挺明显的:
1、ConnFactory类职责过重。一旦需要添加新的数据库,则需要修改CreateDbConnection逻辑。这样违背了OCP(开放-关闭原则);
2、由于使用了static方法,造成Factory无法形成基于继承的结构。
所以简单工厂模式只适用于变化较少的情况。具体要是应用于多变的情况,还是要使用其他工厂模式的。
其他工厂模式是怎么样的呢?我们下回分解。
知行办公,专业移动办公平台
https://zx.naton.cn/
【总监】十二春秋之,3483099@qq.com;
【Master】zelo,616701261@qq.com;
【运营】运维艄公,897221533@qq.com;
【产品设计】流浪猫,364994559@qq.com;
【体验设计】兜兜,2435632247@qq.com;
【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;
【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com;
【java】首席工程师MR_W,feixue300@qq.com;
【测试】土镜问道,847071279@qq.com;
【数据】fox009521,42151960@qq.com;
【安全】保密,你懂的。
- 设计模式(2)-简单工厂模式
- 设计模式(2)简单工厂模式
- 设计模式(2)-简单工厂模式
- 设计模式解读之 简单工厂模式&工厂方法模式&抽象工厂模式(2)
- 设计模式(2)——简单工厂设计模式
- 设计模式(简单工厂)
- 设计模式 - 工厂模式(简单,工厂方法,抽象工厂)
- Java设计模式--工厂模式(简单工厂+工厂方法)
- 设计模式指工厂模式(简单工厂,抽象工厂)
- Java设计模式-工厂模式(简单工厂+工厂方法)
- Java设计模式:工厂模式(一)简单工厂模式
- 设计模式学习之工厂模式(简单工厂模式)
- Java设计模式-工厂模式(1)简单工厂模式
- 设计模式(二)工厂模式:简单工厂模式
- 设计模式之(2)简单工厂模式
- C#设计模式(2)简单工厂模式
- 设计模式2-简单工厂模式
- Java设计模式2:简单工厂模式
- TensorRT Samples: MNIST
- matlab 注册码到期处理办法
- ZooKeeper 分布式锁服务
- NSNotification多次重复通知的解决办法
- 构建Maven多模块项目+SSM框架整合+Thymeleaf(二)
- 设计模式(2)-简单工厂模式
- vc6修改任意字体
- kindle资源
- SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差
- java分割字符串(特殊字符) split
- 数据结构(哈夫曼树)
- hadoop2.2.0升级成hdfs ha后查询报java.net.UnknownHostException
- Redis (Replication) 主从原理和相关配置说明
- 拼音工具类PinyinUtils