设计模式—工厂模式

工厂模式

1.简单工厂模式

目的

为了把客户与具体服务给分离,达到一个解耦的目的,去除了客户端对具体产品的依赖

1.对于调用者来说,工厂隐藏了复杂的逻辑处理过程,调用者只需关心结果,无需在意具体实现过程,去除了对产品的依赖。

2.对于工厂来说,工厂要对结果负责,保证生产出符合规范的产品。

怎么做的

把服务(或者说产品)外包出去,外包给工厂,让工厂来决定应该用哪个具体子类来实例化。

这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。

客户类往往有多个,如果不使用简单工厂,那么所有的客户类都要知道所有子类的细节。

而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。

举例

旅行社的例子

不同旅行社,旅游项目不同,

那我们人手备一份旅行社清单,去西藏,就找蓝天白云旅行社。

去海南,就找海南岛旅行社,去日照,就找日不落旅行社。

一旦有了新的旅行社,或者哪家旅行社倒闭了,或者联系电话更改了

就得更改所有人手中的旅行社清单,太麻烦了。

那就设计一个旅行工厂,客户只需要告诉旅行工厂去哪里玩,工厂来安排具体是哪个旅行社去服务客户。

(但客户是不知道具体是哪家旅行社服务他的,就知道是旅行工厂给他提供的服务)

用户再也不用维护旅行社清单,交给旅行工厂管理,随心所欲,想去哪玩去哪玩。

好处

最大的优点就是工厂类包含了必要的逻辑判断,根据客户的选择条件动态的实例化相关的类。

去除了客户端对具体产品的依赖

缺点

扩展不太好。

工厂类集中了所有实例创建的逻辑一旦需要扩展,就需要修改工厂类。

这违背了开放-封闭原则

解决方案

我能不能扩展的时候,不修改工厂类。

可以,工厂方法设计模式。

ps:

开放-封闭原则是指,对于扩展是开放的,对于修改是封闭的

如果需要扩展,我能不能不update原有的类,只add新的类。

咱们能添就添,不要改。

image-20210807124136134

2.工厂方法模式

介绍

工厂方法模式Factory Method,又称多态性工厂模式。

它是简单工厂的进一步解耦

如何做

工厂方法把实例化操作推迟到子类。

在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给工厂子类去做。

工厂类只定义统一的接口,子类遵循这个规则(接口)就行了。

目的

把具体实现逻辑从工厂类中抽离出来,遵守**“封闭-开放”**原则。

以后再扩展的时候,增加子工厂类就行了,无需动核心工厂类。

该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

img

3.抽象工厂模式

意图:为系统提供更大的可扩展性,提供一个接口,用于创建 一系列的对象家族(如MySql和Oracle家族)

主要解决:主要解决接口选择的问题。(如MySql和Oracle接口)

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OOP 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

使用场景: 1、系统兼容MySql数据库和Oracle数据库2、QQ 换皮肤,一整套一起换。 3、生成不同操作系统的程序。

注意事项:产品族难扩展,产品等级易扩展。
,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

使用场景: 1、系统兼容MySql数据库和Oracle数据库2、QQ 换皮肤,一整套一起换。 3、生成不同操作系统的程序。

注意事项:产品族难扩展,产品等级易扩展。

image-20210808135923770

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值