Head First 设计模式之第四章——工厂方法模式与抽象工厂模式

工厂方法模式

工厂方法模式如下图所示,其定义为:定义一个用于创建对象的接口(如图中的factoryMethod()),让子类决定实例化哪一个类。如下图中所示,创造者(AbstractCreator)的不同子类负责创建不同的产品,这些产品都是AbstractProduct的子类。对于一个需要创建产品的用户(ConcreteClient)而言,只需要给这个用户传入AbstractCreator的子类对象,这个对象用AbstractCreator的引用或指针来代表,然后这个用户调用这个Creator的factoryMethod方法,即可创建这个Creator子类所对应的产品。这个做的好处是避免直接创建具体的对象,用户只需要依赖AbstractCreator这个抽象类(或接口)即可,而创建对象这个事情就由AbstractCreator的子类来实现,一旦需要创建新的产品,如ConcreteProductC,只需要实现ConcreteCreatorC与ConcreteProductC,并将ConcreteCreatorC传入用户中的AbstractCreator的对象处即可,用户的代码不需要任务更改。这非常符合“面向接口编程而非面向具体实现编程”的思想,这个工厂方法模式体现了面向对象中的一种思想,即依赖抽象,而不是依赖具体,那才能更好地拥抱变化。
在这里插入图片描述

抽象工厂模式

抽象工厂模式如下图所示,其定义为:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。感觉抽象工厂模式就是加强版的工厂方法模式,抽象工厂是指从工厂接口(AbstractFactory),它定义了若干个工厂方法来创建不同各类的产品,而其子类则实现这些接口,例如createProductA()方法用于创建ProductA,createProductB()用于创建ProductB,只是不同的具体工厂会创建不同的ProductA与ProductB罢了。对于用户(ConcreteClient)而言,它只依赖抽象工厂(AbstractFactory)与抽象产品(AbstractProductA and AbstractProductB),使用时,只需要将具体的工厂对象传递到用户类中的AbstractFactory类型的对象处,直接调用相应的接口,创建相应的产品,而这些产品存放在AbstractProductA或AbstractProductB类型的引用或指针对象中,供用户类直接使用。这种模式像工厂方法模式一样,令用户类直接依赖接口而不是具体类。

但抽象工厂模式的一个优点时,他横向扩展方便,如有一个新的ProductA或ProductB(可以将ProductA与ProductB分别作为一个产品族),那只需要实现对应的具体产品类与工厂类即可,而不需要改进用户类,但如果一旦有新的产品族,如ProductC,那就要更改AbstractFactory的接口了,那意味着,各个子类中都要实现这个新加的接口,那是一件相当麻烦的事情,这并不符合开闭原则。所以抽象工厂模式适合固定产品族的情况,而不适合产品种族变化的情况。
在这里插入图片描述

两者的对比

相同点:无论是工厂方法还是抽象工厂,他们都是将客户从实例化具体类中解耦出来,即令用户的代码在创建实例对象的时候不依赖于具体类,而是依赖于抽象类,从而实现创建实例时对具体类的解耦。

不同点:工厂方法是实现一个产品的创建,而抽象工厂则是实现一堆产品的创建。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值