为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第9天+工厂方法(创建型)

标签:
设计模式

课程名称:Java设计模式精讲 Debug方式+内存分析

课程章节:第4章

主讲老师:Geely

课程内容:

工厂方法(创建型)

问题1)定义?

**工厂方法:**是一个创建对象的接口(抽象类)的方法,创建对象的细节交给实现类(继承类)。由实现该接口的类来决定实例化哪些类。

工厂方法的目的:工厂方法让类的实例化推迟到子类中进行。

具体操作:工厂的创建对象方法,交由具体的子类实现。(这就是工厂方法)

问题1.1)简单工厂和工厂方法的区别?

工厂方法是多个工厂,让具体的产品实现具体的工厂。而简单工厂是只有一个工厂,根据传入的参数不同,返回不同的对象。

简单工厂模式:如果新增了产品,需要修改工厂代码,添加该产品的代码。这是不符合开闭原子。而工厂方法不需要修改原来代码,只需要新创建一个工厂,符合开闭原则和单一职责原则。(工厂方法的缺点是,每次创建一个产品都要新增工厂,这样会使代码文件持续增加,不利于维护。)

问题2)工厂方法适用场景?

  1. 创建对象需要大量重复代码。

  2. 客户端(应用层)不依赖与产品类实例如何被创建,实现等细节。

  3. 一个类通过其子类来指定创建哪个对象。

客户端只需要指定那个工厂可以使用。不需要关系

里式替换原则和多态性。(子类对象覆盖父类对象)

客户端(应用层)也不需要知道具体的产品类名。具体的产品类实例都由工厂创建。无需关系是哪个工厂创建的。

如果需要动态创建对象,可以通过配置文件,或者存储到数据库当中。

问题3)工厂方法优点?

1、用户只需要关心创建产品需要哪个工厂,无需关心创建细节。

2、加入新产品符合开闭原则,提供扩展性。

问题4)工厂方法urm类图?

1、名词:生产video

抽象产品类:Video

具体产品类:javaVideo,PythonVideo

抽象工厂:VideoFactory

具体工厂:javaVideoFactory,PythonVideoFactory。

工厂方法:抽象工厂中的方法。

如图:如果新增了产品,只需要继承抽象产品类。新增一个产品工厂就可以。

2、产品族和产品等级

产品等级:javaVideo PythonVideo 是同一个产品等级。

工厂方法的作用就是解决产品等级的问题。一个工厂方法生产的具体产品是一个产品等级。

多个工厂方法生产的产品是产品族。

工厂和产品的联系:具体工厂依赖具体的产品。

问题5)工厂方法中产品族和产品等级

(1) 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

(2) 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。

产品族与产品等级结构示意图

不同颜色的多个正方形、圆形和椭圆形分别构成了三个不同的产品等级结构,而相同颜色的正方形、圆形和椭圆形构成了一个产品族,每一个形状对象都位于某个产品族,并属于某个产品等级结构。图3中一共有五个产品族,分属于三个不同的产品等级结构。我们只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一确定这个产品。

问题6)抽象工厂模式与工厂方法模式最大的区别?

**当系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构、属于不同类型的具体产品时就可以使用抽象工厂模式。**抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率。抽象工厂模式示意图

抽象工厂模式示意图

每一个具体工厂可以生产属于一个产品族的所有产品,例如生产颜色相同的正方形、圆形和椭圆形,所生产的产品又位于不同的产品等级结构中。如果使用工厂方法模式,上图所示结构需要提供15个具体工厂,而使用抽象工厂模式只需要提供5个具体工厂,极大减少了系统中类的个数。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消