工厂模式(简单工厂、工厂方法、抽象工厂的迭代)

工厂对象定义:
定义一个创建产品对象的工厂接口,将产品的实际创建工作推迟到具体的子工厂类中。满足了创建型模式中“创建与使用分离”。凡是需要生产复杂对象的地方可以考虑使用工厂模式代替。复杂对象一般是指构造函数过多等对类的构造有影响的情况,因为类的构造过于复杂,在业务类中直接使用,则两者的耦合过重,假如后续业务变更,需要构建的类对象构造参数发生改变时,则需要在任何引用该类的业务代码内更改。
按实际业务场景划分:简单工厂、工厂方法、抽象工厂。
被创建的对象称为:”产品“、创建产品的对象称为:”工厂“
简单工厂模式:(创建实例的方法通常为静态方法,所以又称为静态工厂方法模式)
一个具体的工厂,不需要知道要创建实例的类,只需要传入特定的参数即可创建需要的对象。
模式的结构与实现:
简单工厂的主要角色:简单工厂、抽象产品、具体产品
简单工厂:负责实现创建所有的实例对象的内部逻辑。被外部直接调用创建所需的产品。
抽象产品:是简单工厂创建所有产品对象的父类,负责描述所有实例对象公有的(接口)规范。
具体产品:是简单工厂模式的创建目标(实现抽象产品接口)
结构图:

优点:
1.工厂类中包含必要的判断逻辑决定创建什么对象。工厂创建和产品使用的职责明确。
2.客户端无需知道所创建的类名,只需要知道参数即可。降低耦合
3.如果引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类
缺点:
1.工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。违背高聚合原则。
2.当有新的产品时,不得不修改工厂逻辑,产品过多可能造成逻辑过于复杂。(违背开闭原则),也会引入新的产品类,增加类的个数。
3.简单工厂使用了static工厂方法,造成工厂对象无法基于继承的等级结构。
应用场景:
产品种类较少时
工厂方法:(在不修改原来代码的情况下引进新的产品,满足开闭原则)
模式的结构与实现:
由抽象工厂、具体工厂、抽象产品、具体产品四个角色组成
工厂方法模式的主要角色如下:
抽象工厂:提供创建产品的接口。
具体工厂:主要实现抽象工厂的实现方法,完成具体产品的创建。
抽象产品:定义了产品的规范,描述了产品的主要特性和功能
具体产品:实现了抽象产品角色的规范(接口),有具体工厂创建,与具体工厂为1:1的关系
结构图:

优点:
1.用户只需要知道具体工厂的名称就可以创建想要的产品。
2.典型的解耦框架,灵活性增强,新增一个产品,只需多写一个对应的工厂类。且高层模块(抽象工厂)只需要知道产品的抽象类,无需关心实现类。
缺点:
1.类的个数增多,没一个产品都对应一个工厂类。
2.抽象工厂只能创建一种产品。
应用场景:
1.客户只知道创建产品的工厂名,不知道具体的产品名。
2.创建对象的任务由多个子工厂的某一个完成,而抽象工厂只提供创建产品的接口。
3.客户只关心产品的品牌,不关系创建产品的细节。
抽象工厂:(为访问类提供一类相关或相互依赖对象的接口)
产品等级:同一种类的产品为等级(如:小米手机、华为手机)
产品族:生产一组不同产品等级的产品称为产品族(如:小米、华为)
抽象工厂可以说是工厂方法的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂可生产多个等级的产品。
使用抽象工厂模式一般要满足的条件:
1.系统种有多个产品族,每一具体工厂创建不同等级的产品族。
2.系统一次只能使用一组的产品,即同族的产品一起使用
模式的结构与实现:
包含的角色:抽象工厂、具体工厂、抽象产品、具体产品
1.抽象工厂:提供了创建产品的接口,包含多个创建产品的方法,即可以创建多个不同产品等级的产品。
2.具体工厂:实现了抽象工厂创建不同等级的产品的方法,完成具体产品的创建。
3.抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4.具体产品:实现了抽象产品所定义的接口,由具体产品族工厂创建,与其时多对一的关系
结构图:

优点:
1.类的内部对产品族种相关联的多等级产品共同管理,依赖都在同一个类中,降低耦合
2.当需要产品族时,抽象工厂可以保证客户端始终只使用一个产品族
3.满足开闭原则,当新加一个产品族时,不需要修改源代码,满足开闭原则
缺点:
1.当产品族需要增加一个新的产品时,所有产品族工厂类都需要进行修改。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值