问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

创建型-工厂模式

发布网友 发布时间:2024-10-09 02:23

我来回答

1个回答

热心网友 时间:2024-10-22 13:41

(一)简单工厂模式

模式定义

简单工厂模式(Simple Factory Pattern):又称静态工厂方法(Static Factory Method)模式,属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

简单工厂模式类图:

简单工厂模式包含如下角色:

下面是例子:

创建一个 接口 Shape,和实现接口的类 Circle,Square,Rectangle。

当外界需要某物品时,只需要调用工厂ShapeFactory 的 GetShape(类型)即可。

Shape 接口:

具体的实现类:

简单工厂:

客户端:

我们再看一下简单工厂的核心代码:

如果这个时候,需求要增加一种形状,那么还得修改上述代码!!!

这就是简单工厂的弊病,下个工厂模式可以改善这个情况。

简单工厂模式的优点

简单工厂模式的缺点

(二)工厂模式

工厂模式属于创造型的模式,利用工厂模式,在创建新对象的时候,可以屏蔽复杂的创造逻辑,而且只需要一个共同的接口来指向新的创建对象。

Gof对工厂模式的定义:

工厂方法模式是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说 每个对象都有一个与之对应的工厂 。

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

工厂方法模式类图:

工厂方法模式角色分配:

适用场景

工厂方法模式实例

上面简单工厂例子中的图形接口以及相关图像实现类代码不变。我们只需要增加一个工厂接口以及实现这个接口的工厂类即可。

工厂接口:

圆形工厂类:

长方形工厂类:

客户端:

这样如果需求上面要增加一种形状,只需要增加一个形状类和一个对应的形状工厂即可。无需修改其他的具体产品和具体工厂。符合开闭原则。

工厂方法模式的优点

工厂方法模式的缺点

(三)抽象工厂

学习抽象工厂之前,先来了解下产品族和产品等级结构:

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。

如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。

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

抽象工厂模式定义:

抽象工厂模式又称为Kit模式,属于对象创建型模式。

抽象工厂模式提供了一种方式,可以将同一产品族的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

抽象工厂模式类图:

抽象工厂模式包含如下角色:

每个具体的工厂生产同一个等级中的所有产品。通俗来讲就是每个具体的工厂生产一套产品。

比如一个水杯工厂生产茶杯和茶壶。

举一个例子:

这里有3种产品,冰箱,彩电,洗衣机。冰箱有Work方法,彩电有Open方法,洗衣机有Wash方法。

代码:

为了简便,这里只列举冰箱和彩电代码,洗衣机省略。

冰箱:

彩电:

抽象工厂类:

创建工厂:

客户端:

优点

缺点

适用环境

在以下情况下可以使用抽象工厂模式:

模式应用

在很多软件系统中需要更换界面主题,要求界面中的按钮、文本框、背景色等一起发生改变时,可以使用抽象工厂模式进行设计。就是一个抽象工厂对应一套东西。

总结:

举一个例子:

这里有3种产品,冰箱,彩电,洗衣机。他们都有共同的工作Work方法。

如果用简单工厂实现的话,只需要一个工厂,一个方法,传递不同的参数,制造不同的产品。

如果用工厂模式实现的话,需要一个工厂基类,基类中有一个抽象方法Create();派生出冰箱工厂,彩电工厂,洗衣机工厂。每个工厂负责各自产品的生产。

再升级下例子,现在有海尔冰箱,海尔彩电,海尔洗衣机;格力冰箱,格力彩电,格力洗衣机;

如果用抽象工厂模式实现的话,需要一个工厂基类,基类中有3个方法分别生产冰箱,彩电,洗衣机。派生出海尔工厂和格力工厂。

如果要增加新的品牌比如美的,那么不用修改具体工厂代码,只需要新增一个美的工厂即可。如果不是增加一个品牌,而是增加一个新的产品,比如饮水机,那么就需要修改大量的工厂代码了。

无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你好, 我把内存卡用读卡器插上了,然后电脑显示需要格式化 说检查磁盘... 专科,机电一体化专业的如果考公务员的话,应该做哪些准备 pe塑料菜板好不好-pe塑料菜板用之前应该怎么处理 ...50吨的速度往一艘轮船上装载物资,10小时装载完毕. 码头工人以每天50吨的速度往一艘轮船上装载货物,装载完毕恰好用了8天时... 农历三月初三有什么说法 农历的三月三日是什么意思 第九所攻略大全 新手入门少走弯路-新手攻略-安族网 第九所新手怎么玩介绍_第九所新手怎么玩是什么 《第九所史实》:解锁全新篇章的神秘密码大揭秘! 干锅牛蛙怎么做好吃 干锅牛蛙的烹饪方法 四川金熊猫新媒体有限公司电话是多少? 在会 过会什么意思 自己孩子喝别人的母乳可以吗 在 项羽之死 中虞姬的续写 倩女幽魂将军令福利中心怎么取消绑定角色? 我的白色纯棉T恤,弄到刷纸箱用的黑墨,请问怎么去掉这些污渍_百度... 哪些牌子的旗袍穿起来舒适? 手机将军令怎么解绑啊? 菜鸟驿站纸箱怎么清理垃圾的 热敷和冷敷哪个消肿快 闪送的意义 孩子刚上初中,刚加孩子老师微信要注意什么 第一次跟老师发信息怎么说 我的手机是w619,下载个百度地图,一打开就黑屏死机,用其他软件没问题!就... 宿卅市有几座大学 现在的夏普电视怎么样 好不好呢 ...不一样吗?为什么大家都会选择有超滤膜的净水器? 干海带洗净后晒干保存 海带可以洗净晒干保存吗 期房不能按时交房怎样退钱 设计模式-状态(State)模式 C++设计模式——Decorator装饰器模式 Golang 设计模式之观察者模式 东莞南城汽车站有车到水濂山吗 说什么情话容易让女人轻易对你动心? 女人最想听的情话, 不是“我爱你”, 而是这三句! 墨西哥鸡肉卷怎么下架了啊? 美即绿玉葡萄面膜用完需要洗吗 请问我用过牛尔的绿石泥面膜之后还能用美即的绿茶面膜么? MG美即那个祛痘面膜(绿色包装的)在屈臣氏买10元一张,在网上卖58元10张... 凌志军是哪本畅销书的作者? 云分期是什么东西吗 在铁盒里放一些冰块用酒精灯加热闻到什么 肠胃不大好,该怎么用药? 老年人跳健身操的好处 跳健身操半年后有哪些好处 怎么弄免费空间代码忘哪输入代码啊? QQ空间中如何免费使用导航模块(代码)? 东山国际传世家宝周边情况 东山国际英伦半岛周围交通: