设计模式(二):简单工厂、工厂和抽象工厂的区别。

最近上了软件体系几节课后,感觉对三个工厂模式(简单工厂、工厂、抽象工厂)还是很模糊,于是重新研究了一下其区别。
关于简单工厂模式:
这里写图片描述
例如:我们都熟悉数据库访问类,譬如JAVA的JDBC,PHP的PDO等。
这些类的特点是,都是把需要的不同的数据库访问类封装在其中,当客户端需要调用的时候,只需要传递不同的参数,工厂就可以返回不同的数据库访问类。当然,更smart的的程序可以自己检测本机环境,自动传递参数给简单工厂,进而实现所需的数据库实现。但是,这些调用的实现,都是通过传递参数来决定的,只是自动调用的话,程序员连参数也不用填,其它程序会实现,但是这不是在工厂里实现。简单工厂集成了生产各种物品的功能,并且可以根据参数返回对应的实例。

关于工厂模式:
这里写图片描述
在工厂模式中,每个具体工厂都需要实现工厂工厂这个接口,已实现工厂的基本生产功能。对于权威指南一说:工厂模式是一种定义一个创建对象的接口,让子类决定实例需要的类的模式。工厂方法使一个类的实例化延迟到其子类。简单来说:与简单工厂不同的是,需要客户端来决定实例化哪一个工厂,就是把选择工厂的功能交给了客户端实现。

关于抽象工厂:
这里写图片描述
权威指南所说:提供一个创建一系列相关或者互相依赖对象的接口,但无需指定它们的具体类。额,有点难懂吧。可以这样想,当我们进行数据库的数据表的CRUD实现时,不同的数据可能有不同的SQL标准。因此,对于一个表a,我们仅需要工厂模式就可以了。这里,假设在Mysql的数据有a的CRUD类(mysqlaFactory)或者Oracle的a的CURD类(oracleaFactory),同样,表b的话也有(mysqlbFactory)或者(oraclebFactory)。所以,当客户端想实现mysql的产品-CURDa的更新a的功能时:CRUDa cruda = new CRUDa(), curda.update(xxxx) ;同样,Oracle的也是如此。那么问题来了,跟简单工厂有啥不同?因为抽象工厂的调用权已经不在工厂内实现,但是简单工厂是封装好,在工厂内部实现的,这就是最基本的不同之处。那么,又跟工厂模式有何不同呢?当我们仅有需要连接一种数据库的时候,我们只需要用工厂模式,写不同的工厂以生产出不同数据表的CRUD类如CRUDa,CRUDb,CRUDc就可以了,这些CURD都是同一等级的(就是产品树中属于兄弟关系),所以,工厂只是生产单一等级的实例。但是,如果对于不同的数据库,则需要分成不同的工厂,且不同的表在同一个工厂内又有不同的实现方法,则分成不同的CRUD类。所以,抽象工厂是多等级的(对应就是抽象工厂->抽象数据库工厂->具体数据表工厂)。
那么为什么一定要用抽象工厂呢?程序猿调用需要的CRUD类的时候把所有的CURD类都找一遍不就行了么?但是在实际生产的时候,数据库与表的数量都比较多,这样对于客户端来说造成一种负担。回顾下JAVA的多态,抽象工厂的话,我们只需要用根结点去作为具体CRUD类的引用,在运行时,Jvm可以动态找到对应的子类的方法,这样的好处是便于交换产品系列,譬如Abstract Factory = new mysqlaFactory()。这样,改变一个应用的工厂变得十分容易,只需要改变具体的工厂即可。在设计模式上,抽象工厂可以对其产品树进行管理,每次增加一项产品,只需要增加一片叶子。不需要像工厂模式一样新建立一个产品工厂。

区别表:

特点简单工厂工厂抽象工厂
调用权工厂内部客户端客户端
产品层级一级一级多级

以上是我对这几个工厂模式的一些了解,如果有错误,请各位指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值